设计模式——工厂三姐妹

        今天就用大话上的计算器例子来抒发一下自己的认识。什么是工厂?我理解的工厂是我们需要一个类来创造一些实例,所以就有了工厂,就和我们生活中的工厂是一个作用,用来生产一些想要的对象,在此例中就抽象出了OperationFactory,用来创造加、减、乘、除的实例。如何来创造实例呢?就是一句代码的事,Read=new readbook()就是创造了一个readbook的实例。

一、简单工厂

                                    、

        1.工厂创造所需实例的核心代码如下:

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">public class OperationFactory                           //抽象出的工厂类
    {
        public static Operation createOperate(string operate)
        {
            Operation oper = null;
            switch (operate)                           //工厂可以动态的创造实例
            {
                case"+":                               //创造加法实例
                    oper = new operationAdd();
                    break;
                case "-":
                    oper = new operationSub();         //创造减法实例
                    break;
                case "*":
                    oper = new operationMul();         //创造乘法实例
                    break;  
                case "/":
                    oper = new operationDiv();         //创造除法实例
                    break;
            }
            return oper;
        }</span></span></span>
      优点:使业务逻辑和界面逻辑分开,降低耦合,简单工厂模式就是考虑到底实例化谁,那由谁来实例化呢?就是工厂,工厂是一个类,用来创造实例的过程。最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,例如我们想要计算加法,那么就在客户端输入”+“即可,然后根据客户端输入的符号去判断创造实例。(结合上边的代码看)

       缺点:违反了开放-封闭原则,想要添加新的功能就需要去添加case分支,修改原代码。

二、工厂方法

                     设计模式——工厂三姐妹_第1张图片                                                             设计模式——工厂三姐妹_第2张图片

           1.工厂方法延迟到子类创造实例的核心代码

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">interface IFactory      //抽象出接口
    {
        Operation CreateOperation();
    }
//加减乘除工厂
    class AddFactory:IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
}
………                //省略减乘除的工厂</span>
</span></span></span>
      优点:工厂方法使一个类的实例化延迟到其子类,还将内部逻辑判断移到了客户端代码进行,在新添加一个功能的时候直接修改客户端就行了。如上边的代码,先抽象出一个IFactory的接口,加法工厂继承与他,如果需要实例化加法运算,那么加法工厂去进行实例化。解决了开放-封闭的问题,不用修改原来的类。

      缺点:还是存在选择判断的问题

三、抽象工厂

      提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。

      

      优点:便于交换产品系列,例如上图中的ProductA2 productA2=new ConcreteFatory2(),如果我想要更换为ConcreteFactory1(),那么只需要将代码中的ConcreteFactory2()改为ConcreteFactory1()即可。它让具体的创建实例过程与客户端分离,客户端是通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中,就如上图,客户端认识的只是AbstractFactory和AbstractProductA,具体她有什么类,客户端是不关心的。

      缺点:在需要增加功能的情况下扩展是很麻烦的。怎么解决呢?用反射+抽象工厂就可以了,想要扩展的时候只需要修改一个变量就可以了。

     何时用:在用简单工厂的地方,消除switch或if,解除分支判断带来的耦合。

四、总结

      简单工厂违反了开放-封闭原则,用对应的工厂去创建对应的实例,解决了开放封闭的问题,不过如果想要扩展是相当的麻烦的,这时候就需要老大的出场了,抽象工厂使用反射+抽象工厂的技能就可以打败大BOSS开放封闭和大BOSS扩展困难。最终抽象工厂获得了胜利!层层递进,在原有的基础上一点点的改进,每个模式都是两面的,在设计的时候也不可以滥用。

你可能感兴趣的:(设计模式——工厂三姐妹)