2. 简单工厂模式(Simple Factory Pattern)

一、介绍

   设计模式的出现是解决代码的耦合,将功能颗粒化,各司其职;提高了代码的灵活性,使代码块 更容易扩展、更容易维护 及 更容易复用(不用粘来粘去) ,这节介绍工厂模式家族中最简单的一个 —— 简单工厂模式(Simpl Factory Pattern),根据外界给定的信息,决定创建哪个类的对象。就我目前所认识到的,简单工厂模式解决的是将使用者和创造者分离;使用该功能的人不需要去了解,功能内部是怎么实现的,只要告诉功能模块我要什么就可以了。而,创造该功能者,不需要知道外界谁调用它,指向外提供一个工厂类 负责创建不同的对象即可。

二、UML 图


三、优缺点

优点:这不用多说了,创建者和使用者分离后,似的后续维护扩展更加方便,比如我现在要加个除法运算,那么加一个除法类,再在简单工厂类的switch语句中加一行就可以了,不用动其他运算类,安全性也得到了保证。
缺点:工厂类里集中了所有子类的创建逻辑,每次添加新的算法,我都要动这个类,还牵扯到其他的运算类,可见简单工厂模式并没有把这块问题解决,如何解?这里卖个关子,继续读下一节就会了解了。

四、附录

抽象类:
    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 OperationSub:Operation
    {
        public override double GetResult()
        {
            return NumA - NumB;
        }
    }
   public class OperationMul : Operation
    {
        public override double GetResult()
        {
            return NumA * NumB;
        }
    }

 

工厂类:

 
        public static Operation CreateOperation(string operate)
        {
            switch (operate)
            {
                case "+":
                    return new OperationAdd();
                case "-":
                    return new OperationSub();
                case "*":
                    return new OperationMul();
                default:
                    return null;
            }
        }

 

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

            Operation oper = OperationFactory.CreateOperation(operate);
            oper.NumA = Convert.ToDouble(numA);
            oper.NumB = Convert.ToDouble(numB);
            string result = Convert.ToString((oper.GetResult()), CultureInfo.InvariantCulture);

            Console.WriteLine(result);
            Console.ReadLine();

 

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