首页 > 代码库 > 设计模式-抽象工厂模式

设计模式-抽象工厂模式

概述

在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(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)中的具体工厂名称给替换了,记得之前看过一篇文章,有一种方法可以达到反射的效果,当时没仔细看,写这篇文章的时候也找不到了,所以就没有写出来,希望之后可以找到,然后再更新。

原文地址和第一篇一样,有需要的可以过去看看!