3. 工厂方法模式(Factory Method Pattern)

 

一、介绍

    上一节我们介绍了简单工厂模式,在即将完成的时候留了个小尾巴,简单工厂模式在工厂类里有好多子类的创建过程,无疑这耦合度有些高,能不能把工厂类和子类的这一耦合降低呢?答案是可以的,工厂方法模式就是在简单工厂模式的基础上解决该问题的。他把工厂类提升为一个接口(IFactory),接口里有创建类的声明(或包含方法体),再创建各自的子类工厂,这些子类实现工厂接口;还有一点要注意的是,他将要创建哪个类的实例这一判断过程推给了客户端去处理。
 

二、UML 图

三、优缺点

优点:这样做的好处就是解决了简单工厂模式工厂类的耦合问题,将工厂类的高层模块和模块模块(使用者和创建者)的职责进一步分离,高层只需要知道底层的抽象类即可,其他实现类并不需要关心,这符合了迪亚米法则(最少知道);客户端对只需知道在修改或增加一个操作的同时不会影响到其他的功能操作,也符合了面向对象的五大原则之一的开放封闭原则(对扩展开放-对修改封闭 OCP)。
缺点:增加了层次结构在增加

四、附录

Operation 类
   public abstract  class Operation
    {
        private double _numA;
        private double _numB;

        public double NumA
        {
            get { return this._numA; }
            set { this._numA = value; }
        }

        public double NumB
        {
            get { return this._numB; }
            set { this._numB = value; }
        }

        public abstract double GetResult();
    }

 

 
三个子类
    public class OperationAdd : Operation
    {
        public override double GetResult()
        {
            return NumA + NumB;
        }
    }
    public class OperationMul : Operation
    {
        public override double GetResult()
        {
            return NumA * NumB;
        }
    }
    public class OperationSub : Operation
    {
        public override double GetResult()
        {
            return NumA - NumB;
        }
    }

 

工厂接口
   public interface   IOperationFactory
   {
       Operation CreateOperation();
   }

 

三个子类实例化工厂
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
        public Operation CreateOperation()
        {
            return new OperationMul();
        }

 

使用
            Console.Write("请输入数字A:");
            string numA = Console.ReadLine();
            Console.Write("请输入运算符号(+、-、*):");
            string operate = Console.ReadLine();
            Console.Write("请输入数字B:");
            string numB = Console.ReadLine();

            IOperationFactory factory = null;
            switch (operate)
            {
                case "+":
                    factory = new AddFactory();
                    break;
                case "-":
                    factory = new SubFactory();
                    break;
                case "*":
                    factory = new MulFactory();
                    break;
            }
            if (factory != null)
            {
                Operation oper = factory.CreateOperation();
                oper.NumA = Convert.ToDouble(numA);
                oper.NumB = Convert.ToDouble(numB);
                double result = oper.GetResult();
                Console.WriteLine(result);
            }

 

posted @ 2019-05-01 07:50  NCat  阅读(114)  评论(0)    收藏  举报