首页 > 代码库 > 设计模式-抽象工厂模式
设计模式-抽象工厂模式
概述
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。
意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using System.Text;using System.Threading.Tasks;namespace AbstractFactoryPattern{ class Program { static void Main(string[] args) { //得到国家的实例 AbstractFactory af = AbstractFactory.GetInstance(); //中国人基本工资 IBonus cs = af.CreateBonus(); //中国个人所得税 ITax ct = af.CreateTax(); //工资 double salary ; salary = Constant.BASE_SALARY + cs.Calculate() - ct.Calculate(); Console.WriteLine("Chinese salary is : {0}",salary); Console.ReadLine(); } } /// <summary> /// 公共常量 /// </summary> public class Constant { public static double BASE_SALARY = 4000; public static string BASE_FACTORYNAME = ConfigurationManager.AppSettings["factoryName"].ToString(); } #region 接口和抽象类 /// <summary> /// 计算个人奖金接口 /// </summary> public interface IBonus { double Calculate(); } /// <summary> /// 计算个人所得税接口 /// </summary> public interface ITax { double Calculate(); } public abstract class AbstractFactory { public static AbstractFactory GetInstance() { string factoryName = Constant.BASE_FACTORYNAME; AbstractFactory instance; if (factoryName == "ChineseFactory") { instance = new ChineseFactory(); } else if (factoryName == "AmericanFactory") { instance = new AmericanFactory(); } else return null; return instance; } public abstract IBonus CreateBonus(); public abstract ITax CreateTax(); } #endregion #region 计算公式 /// <summary> /// 得到中国计算公式的实例 /// </summary> public class ChineseFactory:AbstractFactory { public override IBonus CreateBonus() { return new ChineseBonus(); } public override ITax CreateTax() { return new ChineseTax(); } } /// <summary> /// 得到美国计算公式的实例 /// </summary> public class AmericanFactory : AbstractFactory { public override IBonus CreateBonus() { return new AmericanBonus(); } public override ITax CreateTax() { return new AmericanTax(); } } /// <summary> /// 计算中国个人奖金 /// </summary> public class ChineseBonus:IBonus { public double Calculate() { return Constant.BASE_SALARY * 0.1; } } /// <summary> /// 计算美国个人奖金 /// </summary> public class AmericanBonus : IBonus { public double Calculate() { return Constant.BASE_SALARY * 0.15; } } /// <summary> /// 计算中国个人所得税 /// </summary> public class ChineseTax:ITax { public double Calculate() { return (Constant.BASE_SALARY + Constant.BASE_SALARY * 0.1) * 0.4; } } /// <summary> /// 计算美国个人所得税 /// </summary> public class AmericanTax : ITax { public double Calculate() { return Constant.BASE_SALARY * 0.4; } } #endregion}
在原文中使用了反射,来将抽象工厂类(AbstractFactory)中的具体工厂名称给替换了,记得之前看过一篇文章,有一种方法可以达到反射的效果,当时没仔细看,写这篇文章的时候也找不到了,所以就没有写出来,希望之后可以找到,然后再更新。
原文地址和第一篇一样,有需要的可以过去看看!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。