zoukankan      html  css  js  c++  java
  • 简单工厂 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中的分支语句,所以。对于简单工厂和抽象工厂方法二者应该酌情使用。二者都有自己的长处和缺点,我们应该依据详细情况详细分析。

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

     

     

     

        

  • 相关阅读:
    <摘录>如何在64位linux强制编译32位应用程序
    Ubuntu安装Java
    Mybatis学习
    Java小工具Lombok
    jenkins忘记admin密码的处理方法
    list删除元素
    ConcurrentHashMap详解
    用户登录
    SpringDemo01
    SpringBoot Eclipse 热部署
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5056368.html
Copyright © 2011-2022 走看看