简单工厂 VS 工厂方法 VS 抽象工厂

         说到设计模式。自然少不了简单工厂模式。工厂方法和抽象工厂这三姐妹。

它们之间可谓是各有所长,术业专攻啊!这篇博客来简单的梳理一下三者之间的关系。

那么工厂又是什么意思呢?结合三者的特点,我觉得能够这样理解:工厂能够看做一个特殊的类,在这个类中专门负责生产一系列产品(对象)的一个集合就能够成为工厂。

那么上述三种模式之间到底是如何的关系呢?各自又有什么优缺点呢?

一、简单工厂模式 VS 工厂方法模式

1、先来看一个简单工厂的一段代码:

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 ;
        }

通过代码我们能够看出。在简单工厂中,能够讲多种须要实例化的对象在一个分支结构中一次性的完毕。详细的选择要留给client去做。

比如:

oper= OperationFactory.createOperate("+");

那我们继续扩展。当我们想要在程序中添加一种算法符号,这时,我们必须对简单工厂中的分支语句进行改动。这样事实上就违背了设计模式中的开放——封闭原则。为了避免对内改动。我们再来看一下工厂方法模式。

2、工厂方法模式

       核心思想:创建一个接口,子类去实现这个接口。同一时候,依据子类来决定到底要实例化哪个对象。

看一段代码:

    interface IFactory //定义一个接口
    {//非静态                                                                                                                           Operation CreateOperation();

    }
    class AddFactory:IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();//子类j决定详细对哪个子类进行实例化
        }
    }

    class SubFactory:IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }

其余代码类似略。

     通过工厂方法模式。我们能够发现,假设如今再添加一个运算符的话。我们仅仅须要额外添加一个运算符子类和实现接口的子类就好了,而不用去对已经写好的类进行改动了。可见与简单工厂相比,工厂方法模式遵循了开放——封闭原则:即对外扩展,对内封闭。

另一个小小的差别:在简单工厂中用static声明方法为静态方法,而工厂方法中却未用到静态方法,原因是:在简单工厂中因为不须要子类进行继承,所以使用静态方法能够避免实例化。能够用类来直接调用方法。而在工厂方法中因为存在继承关系,所以不能使用静态方法

二、 工厂方法 VS 抽象工厂

      我觉得事实上这二者本属于一类。

      最基本的差别是:

      工厂方法:涉及到的是仅仅需定义一个产品类和一个对象接口。能够派生出多个子类。

      而抽象工厂:定义一系列即多个产品类和多个对象接口。分别派生出多个子类。

     这里,不多做解释。

三、简单工厂 VS 抽象工厂 

      在抽象工厂中能够定义多个产品类和对象接口,但是,假设我们想要在此基础上多加一个产品,那么此时。须要添加的类就会非常多。同一时候还须要去更改涉及到的各个工厂。这事实上无形中就已经添加了代码的维护量。

对于编程来说又是一个不好的兆头。那么有什么办法能够改进它呢?事实上,简单工厂能够弥补这个缺陷。

举一个大话设计模式中的样例:创建数据库:SqlServer和Access两类,同一时候包括IUser和IDepartment两张表假设用抽象工厂方法来设计如图:

如图,假设此时,我们想要在添加一个项目表Project时。必须添加项目接口。SqlserverProject和AccessProject的类同一时候。还必须改动企业两个工厂,在两个工厂中添加实例化Project的项,造成代码维护量添加。

此时。假设我们把IFactory抽象工厂用一个DataAccess来取代。同一时候添加一个字符串变量,利用简单工厂来实例化字符串变量中所指定的数据库。

简单工厂方法的类图例如以下:

当然,我们能够看出来。利用简单工厂方法。尽管修改相对少了。可是仍然违背了开放——封闭原则。由于在添加其它表时。仍须要修改DataAccess中的分支语句,所以。对于简单工厂和抽象工厂方法二者应该酌情使用。二者都有自己的长处和缺点,我们应该依据详细情况详细分析。

当然为了进一步改进。大话设计模式中还提到了利用“反射”和配置文件的技术。总之。设计模式是一门艺术,仅仅有更好。没有最好!

 

 

 

    

原文地址:https://www.cnblogs.com/zfyouxi/p/5056368.html