简单工厂
简单工厂:简单工厂并非设计模式的一种。
UML如下图所示
说明
主要分为两个角色:Product
和Factory
。Product
是产品的抽象接口,定义了产品的行为,具体的产品会实现这个类型,定义特定的行为。而Factory
是工厂类,主要负责产品的创建工作,并且统一返回Product
这个接口,而非具体产品。
优势
考虑以下场景:假设我们有一个Consumer
需要依赖Product
。
- 首先我们将
Product
的创建工作从Consumer
中分离出来交给了Factory
,Consumer
只需要关注如何使用Product
。让每个角色可以各司其职,符合单一职责原则。 - 另一方面,因为
Consumer
和Product
中间通过Factory
联系,且Factory
并没有返回具体的Product
,那么假设Consumer
依赖的产品发生变换,或是添加了新的Product
,对Consumer
的修改相对来说较小。降低了Consumer
和Product
的耦合。
工厂方法模式
UML类图:
说明
工厂方法模式中的工厂只是一个抽象的接口,具体的产品创建过程在具体的子类中实现。每种产品都有自己的工厂类去创建。
优势
相较于简单工厂,工厂方法模式的优势在于当Product
的种类不断增多时,Factory
不再需要不断的修改自己创建Product
的方法。只需要在增加Product
时,同时增加相应的Factory
即可。比较好的满足了开闭原则。
抽象工厂模式
UML类图:
说明
抽象工厂方法可以针对产品族进行管理,确保一系列的组件能够互相匹配。
优势
抽象工厂屏蔽了Consumer
对于底层一组Product
的感知,只需修改一个工厂类,就有可能调整整个Consumer
的行为。对于需要依赖一系列组件工作的客户端来说,抽象工厂做到了高内聚低耦合。
劣势
抽象工厂的劣势是一套组件中需要增加一个新组建时,需要修改接口中的方法,因此影响了所有工厂的实现类。
工厂模式的退化
- 当工厂的接口和实现合并为一个类时,
工厂方法模式
退化成了简单工厂
。 - 当
抽象工厂
负责的产品只有一个时,变退化成了工厂方法模式
。
DEMO及测试代码见Github。