zoukankan      html  css  js  c++  java
  • 抽象工厂模式

    简单工厂模式:

                      有点:所有的产品都在一个工厂里创建。实现了,消费和生产的分离,

                      缺点:是不符合高内聚的原则,无法我缝扩展。

    工厂模式:

                  优点:实现了高内聚就的原则。所有的工厂职责单一,可以无缝扩展。

                  缺点:工厂类太多了,维护麻烦。

    抽象工厂模式:工厂不在生成单一的对象,而是生成有依赖关系的多个子对象。抽象工厂模式集合了,前两者的优点,屏蔽了一些缺点。

    详情可以看他的这边文章:http://www.cnblogs.com/Terrylee/archive/2005/12/13/295965.html

    虚拟案例

    中国企业需要一项简单的财务计算:每月月底,财务人员要计算员工的工资。

    员工的工资 = (基本工资 + 奖金 - 个人所得税)。这是一个放之四海皆准的运算法则。

    为了简化系统,我们假设员工基本工资总是4000美金。

    中国企业奖金和个人所得税的计算规则是:

             奖金 = 基本工资(4000) * 10%

             个人所得税 = (基本工资 + 奖金) * 40%

    我们现在要为此构建一个软件系统(代号叫Softo),满足中国企业的需求。

    案例分析

    奖金(Bonus)、个人所得税(Tax)的计算是Softo系统的业务规则(Service)。

    工资的计算(Calculator)则调用业务规则(Service)来计算员工的实际工资。

    工资的计算作为业务规则的前端(或者客户端Client)将提供给最终使用该系统的用户(财务人员)使用。

    根据他的文章自己写的实现

    先是服务端代码:

     抽象工厂和他的子类

    代码

      /// <summary>
        /// 抽象工厂类
        /// </summary>
        public abstract class AbstractFactory
        {
            public static AbstractFactory GetInstance()
            {
                string factoryname = Contant.Src_FactoryName;
                AbstractFactory instance;
                if (factoryname != null) {
                    instance = (AbstractFactory)Assembly.Load("AbstractFactory").CreateInstance(factoryname);
                }
                else
                {
                    instance= null;
                }
                return instance;
            }
    
            public abstract Tax CreateTax();
            public abstract Bonus CreateBonus();
        }

    抽象产品A类

      /// <summary>
        /// 抽象工厂子类 计算奖金
        /// </summary>
        public abstract class Bonus
        {
            /// <summary>
            /// 计算奖金
            /// </summary>
            /// <returns></returns>
            public abstract double Calculate();
        }

    抽象产品B类

     /// <summary>
        ///  抽象工厂子类:计算个人所得税的类
        /// </summary>
        public abstract class Tax
        {
            public abstract double Calculate();
    
        }

    根据上面的抽象工厂去实际生产产品

     

     实现抽象工厂ChineseSalaryFactory类

    /// <summary>
        /// 中国员工的工厂类
        /// </summary>
        public class ChineseSalaryFactory:AbstractFactory.Server.AbstractFactory
        {
            public override Tax CreateTax()
            {
               return new ChineseTax();
            }
    
            public override Bonus CreateBonus()
            {
                return new ChineseBonus();
            }
        }

    实现产品A 

        /// 子类创建计算中国奖金的类
        /// </summary>
        public class ChineseBonus : Bonus
        {
            public override double Calculate()
            {
                return Contant.BaseSalary * 0.1;
            }
        }

    实现产品B

        /// <summary>
        ///创建计算中国员工个人所得税子类
        /// </summary>
        public class ChineseTax : Tax
        {
            public override double Calculate()
            {
                return (Contant.BaseSalary + Contant.BaseSalary * 0.1) * 0.4;
            }
        }
    View Code

    第二个 实现抽象工厂AmericaSalaryFactory类

     public class AmericaSalaryFactory : Server.AbstractFactory
        {
            public override Server.Tax CreateTax()
            {
                return new AmericaTax();
            }
    
            public override Server.Bonus CreateBonus()
            {
                return new AmericaBonus();
            }
        }
    View Code

    实现产品A

        public class AmericaBonus : Bonus
        {
            public override double Calculate()
            {
                return Contant.BaseSalary * 0.15;
            }
        }
    View Code

    实现产品B

        public class AmericaTax : Tax
        {
            public override double Calculate()
            {
                return Contant.BaseSalary * 0.05 + Contant.BaseSalary * 0.15 * 0.25;
            }
        }
    View Code

    然后是客户端调用代码

       class Program
        {
            static void Main(string[] args)
            {
                //创建抽象工厂模式实例
                AbstractFactory.Server.AbstractFactory factory=AbstractFactory.Server.AbstractFactory.GetInstance();
                var Tax = factory.CreateTax();
                var bonus = factory.CreateBonus();
                double salary = AbstractFactory.Contant.BaseSalary - Tax.Calculate() + bonus.Calculate();
                Console.WriteLine("个人所得奖金为:" + bonus.Calculate());
                Console.WriteLine("个人所得税为:"+Tax.Calculate());
                Console.WriteLine("工资为:" + salary);
                Console.ReadLine();
            }
        }
    View Code

    代码下载:Factory.zip

  • 相关阅读:
    使用一行Python代码从图像读取文本
    FastAI 简介
    OpenCV-Python 轮廓:更多属性 | 二十四
    Numpy和OpenCV中的图像几何变换
    从云计算到边缘计算
    OpenCV-Python 轮廓属性 | 二十三
    c# GetType()和typeof()的区别
    C# 子类父类方法同名,三种处理方式
    C# string 与 String的区别
    decimal
  • 原文地址:https://www.cnblogs.com/Blogs-Wang/p/6407204.html
Copyright © 2011-2022 走看看