【大话设计模式】比较工厂三姐妹

时间:2022-10-02 17:12:35

在没开始看大话设计模式以为是本小人书呢,当我开始看书的时候发现真的是本小人书,通过生活的一些规律告诉我们各种设计模式,借用英语上的就是思维闪现,每次想到设计模式就能想到小故事,看到小故事就能想起是那个设计模式,所以大话设计模式可是本好书,就是以我的水平看让人晕头转向的,而且在看大话模式的时候出现了三个叫工厂的,一个简单工厂,一个是工厂方法,另外一个是抽象工厂,当看见这三个工厂了就有种想比较他们的冲动,到底他们三个有什么区别呢?下面看看我的总结来告诉你们:

      拿一个生产水杯(cup)的工厂举例:起初,不用工厂模式,我必须在生产水杯之前知道水杯的材料和形状等水杯的所有特征才能生产,厂主发现同一形状的被子,只是材料不同,如一个是玻璃(glass)的,一个是瓷(china)的,但是确要两条生产线,显然有资源浪费的嫌疑。现在厂主生产杯子时先不让生产线知道我要产的是玻璃的还是瓷的,而是让它在不知道具体材料的情况下先做它能做的,等到它把模具做好,只需要向其中填充玻璃原料或者瓷原料就可以造出同一形状的具体杯子了,所以就有了简单工厂模式。简单抽象工厂模式有一个问题,就是当我现在想生产一个同样形状的铁杯时,工厂里并没有定义相应的处理流程,这就不合理了。我们需要改整条生产线,因为生产线在生产模具的时候还要考虑是为玻璃杯生产的模具还是为铁杯生产的 模具,于是就有了工厂模式 ,如果现在工厂想要生产水壶,用工厂模式就不得不再造一条水壶生产线,能不能在水杯生产线同时生产水壶呢?这就是抽象工厂模式。      

      1.简单工厂模式:

      又叫静态工厂方法,是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。它的优点是包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。他的缺点是违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中。

     一句话:用来生产同一等级结构中的任意产品(不支持增加新产品)

     缺点:当需要增加新产品时,需要修改工厂类,不符合开放封闭原则
     他的结构图(如下):

                                                       简单工厂模式

【大话设计模式】比较工厂三姐妹

 简单工厂实例:

 【大话设计模式】比较工厂三姐妹

 2.工厂方法模式:

      定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化延迟到其子类。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,

       优点:使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。解决了许多简单工厂模式的问题,首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。工厂方法实现时,客户端需要决定实例化哪一个工厂,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部的逻辑判断移到了客户端进行。要想增加功能,简单工厂模式是该工厂类,工厂方法是该客户端。

    步骤:

(1) 一个工厂创建一个产品,所有的具体工厂继承自一个抽象工厂。
(2) 客户端先创建不同产品工厂,再由工厂创建具体产品,
(3 )产品的创建逻辑分散在每个具体工厂中。客户端只依赖于抽象工厂与抽象产品,不依赖于具体的工厂与具体产品增。加新产品是需要增加工厂类和产品类。

  结构图(如下图):

                                                       工厂方法模式 

【大话设计模式】比较工厂三姐妹

工厂方法模式实例:

【大话设计模式】比较工厂三姐妹

3、抽象工厂模式:

提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类
用来生产不同产品族的全部产品,易于交换产品系列。(对于增加新产品,无能为力,支持增加产品族)。
 

抽象工厂模式的优点:

    (1)易于交互产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。

    (2)它让具体的创建实例过程与客户端分离,客户端是通过他们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
抽象工厂模式的缺点:

    (1)是如果增加一个功能,至少要增加一个抽象产品AbstractProductC和两个具体产品ProductC1、ProductC2,还得更改抽象工厂接口AbstractFactory和具体的工厂ConcreteFactory1、ConcreteFactory2.

结构图:

【大话设计模式】比较工厂三姐妹


工厂方法VS简单工厂

 1  工厂方法  除将产品抽象出一个接口以便实现多态,还将不同的工厂进行细分,统一继承自一个接口,将简单工厂中的判断移至客户端。实现了开-闭原则。
2 客户端若使用一个工厂对象生产多个产品,而简单工厂需要修改每个生产函数的参数,工厂方法模式只需修改初始化语句。

工厂方法VS抽象工厂

 工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。

区别

1、工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

2、工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

3、工厂方法模式提供的是对一个产品的等级模式,,而抽象工厂方法提供的是对多个产品的等级模式。

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

按照顺序,是抽象程度依次加深。简单工厂模式最易理解。当需要一个相同的接口,但里面完成内容不同的时候,就可以用一个工厂来产生其中多个类的一个实例。它最明显的是有一个工厂类来产生接口实例。无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。
 

小结:

简单工厂模式只有一份抽象的产品,工厂是具体的;(普通)工厂模式的同样也只有一份抽象的产品,但工厂有抽象的了;抽象工厂模式工厂当然是抽象的,但是它独特的地方在于产品至少有两份是抽象的。

           希望大家多多指导!