Java设计模式

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

2019-11-21  本文已影响0人  阿斯巴甜不太甜

转载并补充自:https://www.cnblogs.com/qiaoconglovelife/p/5750290.html

简单工厂

image

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

缺点:

适用场景:单个产品且种类较少且固定

抽象类别比较少的时候,比如http传输方式只有GET和POST

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

工厂方法模式

image

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

优点:

缺点:

适用场景:单个产品且种类不确定容易变化

比如数据库访问类,不同数据库使用模式可能不一致,但是基础操作都是增删改查,产品很多:MySQL、Oracle、SQLite等等并且随时可能添加一个新的数据库,这个时候

抽象工厂

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

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

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

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


image

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

适用场景:具有产品族抽象规范(每个工厂都具有同样类型的产品)且有多个类别的时候。

硬件设备的连接:dell家的鼠标、键盘、显示器;Lenovo家的相同产品等等

区别

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

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

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

注意事项

上一篇 下一篇

猜你喜欢

热点阅读