大话设计模式之一简单工厂模式

    这是我所敲的第一个设计模式,一个严格来说不能算作设计模式的模式,一个让我这个菜鸟头疼了两天的模式~对于刚才VB6.0转战过来的、从前认为代码简单即是优的我来说,理解这个过程真的很痛苦呢~

    在这里也受到了面向对象的第一次洗礼,所有的代码都不能只顾着眼前,单纯的只为了设计出某些功能就算完事了,而需统筹兼顾,站在更高的层次如安全性、维护性、经济性上看问题。我们要尝试着去做一个设计者,而不是单纯的复制粘贴似的代码工人。

    这个例子是为了实现一个简单计算器的运算功能。在其演变当中,从封装到继承再到多态,无一不在体现着可维护、可复用(可不是复制哦)、可扩展、灵活性好的特点。首先来看一下简单工厂的UML图:

                大话设计模式之一简单工厂模式_第1张图片

 

   

     再来看看代码:

    Operation运算类:定义简单工厂创造的对象父类,可以是一个类、或者一个接口。    

    //创建父类Operation
    public class Operation
    {
        private double _numberA = 0;
        private double _numberB = 0;
        //NumberA属性
        public  double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }
        //NumberB属性
        public   double NumberB
        {    get { return _numberB; }
             set { _numberB = value; }
        }
        //构建运算虚方法
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }


 

    加法、除法类:它们是工厂具体加工的对象
    //加法类,继承运算类(Operation)
    class OperationAdd:Operation 
    {
        //方法重写,将父类实现替换为子类的实现
        public override double GetResult()
        { 
            double result = 0;
            result = NumberA + NumberB;
           return result;
        }
    }

    //除法类
    class OperationDiv : Operation
    {
        //方法重写
        public override double GetResult()
        {
            double result = 0;
            //判断
            if (NumberB == 0)
                throw new Exception("除数不能为0!");
            else 
                result = NumberA / NumberB;
            return result;
        }
    }


    简单运算工厂类:simple factory的核心,含所有实例的内部逻辑,可被客户端等调用,用来创建产品所需的对象。 它可以是一个接口,也可以是一个抽象类

 
    public  class OperationFactory
    {
        //首先createOperate是一个静态方法(static),这意味着不用创建OperationFactory类的实例对象就能调用这个方法,OperationFactory.createOperate(operate);
        //其次这个方法的返回值类型是Operation,方法包含一个String类型的参数,public决定了这个方法是一个公共方法
        public static Operation createOperate(string operate)
        {
            Operation oper = null;
            switch (operate)
            {
                //实例化加法类
                case "+":
                    oper = new OperationAdd();
                    break;
                    break;
                //实例化除法类
                case "/":
                    oper = new OperationDiv();
                    break;
            }
            return oper;
        }
    }


    客户端代码:只知道传入了工厂类的参数,对于如何创建对象(逻辑)不关心

            //举例加法运算 
            Operation oper;
            oper = OperationFactory.createOperate("+");
            oper.NumberA = 1;
            oper.NumberB = 2;
            double resultAdd = oper.GetResult();
            //显示运算结果
            Console.WriteLine("加法运算的结果值为:{0}", resultAdd);
            Console.ReadLine();

            //除法
            oper = OperationFactory.createOperate("/");
            oper.NumberA = 1;
            oper.NumberB =5;
            double resultSub = oper.GetResult();
            Console.WriteLine("除法运算的结果值为:{0}",resultSub );
            Console.ReadLine();

 

    这样写完之后,各个运算类之间是独立的,耦合性大大降低。如果想要增加一个乘法运算,只要编写一个乘法类,在简单工厂模式(代码安全,没有运算过程)中增加一条case语句就行了。下面是执行结果:
                                                                                                大话设计模式之一简单工厂模式_第2张图片

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

    缺点:由于简单工厂模式本身包括了所有的运算方式,每次维护或者扩展计算方法都要改动这个工厂,以致代码重新编译部署,解决方法在后续的学习当中会出现。

 

 

 

   

你可能感兴趣的:(大话设计模式之一简单工厂模式)