标签:style blog color 使用 strong os
概述
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(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)中的具体工厂名称给替换了,记得之前看过一篇文章,有一种方法可以达到反射的效果,当时没仔细看,写这篇文章的时候也找不到了,所以就没有写出来,希望之后可以找到,然后再更新。
原文地址和第一篇一样,有需要的可以过去看看!
标签:style blog color 使用 strong os
原文地址:http://www.cnblogs.com/wym1140679188/p/3833045.html