Bootstrap

简单工厂、工厂方法、抽象工厂之小结、区别

本文有更新,请移步我的个人博客:https://blog.andyqiao.top/article/12/

 

很多时候,我发现这三种设计模式难以区分,常常会张冠李戴闹了笑话。很有必要深入总结一下三种设计模式的特点、相同之处和不同之处。

1 本质

  三个设计模式名字中都含有“工厂”二字,其含义是使用工厂(一个或一系列方法)去生产产品(一个或一系列类的实例)

  另外,有时候,我们常常会将生产产品的一个或一系列方法封装到一个类中,我习惯把这个类叫做“工厂类”;而被实例化的类称作“产品类”。

2 简单工厂

  工厂类(SimpleFactory)拥有一个工厂方法(create),接受了一个参数,通过不同的参数实例化不同的产品类。

  如下边UML类图所示为简单工厂。  

  

  优点:

    (1)很明显,简单工厂的特点就是“简单粗暴”,通过一个含参的工厂方法,我们可以实例化任何产品类,上至飞机火箭,下至土豆面条,无所不能。所以简单工厂有一个别名:上帝类。

  缺点:

    (1)任何”东西“的子类都可以被生产,负担太重。当所要生产产品种类非常多时,工厂方法的代码量可能会很庞大。

    (2)在遵循开闭原则(对拓展开放,对修改关闭)的条件下,简单工厂对于增加新的产品,无能为力。因为增加新产品只能通过修改工厂方法来实现。

  工厂方法正好可以解决简单工厂的这两个缺点。

3 工厂方法

  工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。

  如下边UML类图所示为工厂方法。

  

  优点:

    (1)工厂方法模式就很好的减轻了工厂类的负担,把某一类/某一种东西交由一个工厂生产;(对应简单工厂的缺点1)

    (2)同时增加某一类”东西“并不需要修改工厂类,只需要添加生产这类”东西“的工厂即可,使得工厂类符合开放-封闭原则。

  缺点:

    (1)相比简单工厂,实现略复杂。

    (2)对于某些可以形成产品族的情况处理比较复杂。

  对于缺点(2),我们可以借用抽象工厂来实现。

4 抽象工厂

  抽象工厂是应对产品族概念的。

  例如,汽车可以分为轿车、SUV、MPV等,也分为奔驰、宝马等。我们可以将奔驰的所有车看作是一个产品族,而将宝马的所有车看作是另一个产品族。分别对应两个工厂,一个是奔驰的工厂,另一个是宝马的工厂。与工厂方法不同,奔驰的工厂不只是生产具体的某一个产品,而是一族产品(奔驰轿车、奔驰SUV、奔驰MPV)。“抽象工厂”的“抽象”指的是就是这个意思。

  上边的工厂方法模式是一种极端情况的抽象工厂模式(即只生产一种产品的抽象工厂模式),而抽象工厂模式可以看成是工厂方法模式的一种推广。

  如下边UML类图所示为抽象工厂。

  

  优点:针对产品族;

  缺点:针对产品族。

  所以,只有对应产品族的情况下,才需要使用抽象工厂模式。

5 区别

  简单工厂 : 用来生产同一等级结构中的任意产品。(不支持拓展增加产品)

  工厂方法 :用来生产同一等级结构中的固定产品。(支持拓展增加产品)   

  抽象工厂 :用来生产不同产品族的全部产品。(不支持拓展增加产品;支持增加产品族)  

6 注意事项

  (1)工厂类常常采用单例模式(Singleton)。

  (2)工厂类拥有基类(定义共同接口),基类可以为纯虚类,也可以定义缺省方法。

  (3)对于工厂方法和抽象工厂,基类中的生产产品的函数常常为虚函数,以实现动态绑定。

  (4)调用工厂方法的函数通常采用工厂实现的指针和引用作为形参,以便根据不同的工厂实参调用不同的工厂方法。

转载于:https://www.cnblogs.com/qiaoconglovelife/p/5750290.html

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;