设计模式(5):工厂与抽象工厂模式

一、简单工厂

定义:由一个工厂对象决定创建出哪一种产品类的实例

类型:创建型,但不属于GOF23种设计模式

适用场景:工厂类负责创建的对象较少,客户端/应用层,只知道传入工厂类的参数,对于如何创建对象不关心

优点:只需要传入参数就可以获取所需要的对象而不需要知道其细节

缺点:增加新的产品需要修改工厂类的逻辑,违背了ocp

二、工厂方法

简答工厂和工厂方法的区别是,简单工厂没使用抽象类或是接口,工厂是另一个类的使用对象。工厂方法的子类看起来很像简单工厂,简单工厂把全部事情在一个地方处理完了,但是工厂是创建一个框架,让子类去决定要怎么实现,简单工厂只是把对象的创建封装起来,不能变更产品,与工厂方法相比少了些弹性。

工厂方法是解决同一产品等级的业务抽象问题

1、定义:定义一个创建对象的接口,由子类来决实例化哪个类,让类的实例化推迟到子类中进行。

2、类型:创建型

3、适用场景:创建对象需要大量重复的代码,应用层不依赖于产品类实例如何被创建、实现等细节,一个类通过其子类来创建对象,只需要所对应的工厂,无需关心是哪个子类实现。

4、优点

  • 用户只需关心产品对应的工厂,无需关心创建细节;

  • 加入新的产品也符合OCP,提高可扩展性。

  • 能够设计出符合依赖倒置原则(DIP)的结构(Head First p140)

5、缺点

  • 类的个数容易过多,增加了复杂度;增加系统的抽象性和理解难度

6、例子

产品:Video

产品子类:JavaVideo、PythonVideo、FEVideo…

创建者(工厂):VideoFactory

工厂子类:JavaVideoFactory、PythonVideoFactory、FEVideoFactory…

通过工厂子类来创建…
在这里插入图片描述

三、抽象工厂

1、定义:提供一个接口,能够创建一组相关或者相互依赖的对象。

“抽象工厂允许客户使用抽象的接口来创建一组相关的产品,不需要知道产出的具体产品是什么”

2、类型:创建型

3、适用场景

  • 客户端或应用层不依赖于产品类实例是如何被创建、如何被实现的;

  • 一系列相关产品对象(同一个产品族)一起使用创建对象需要大量重复的代码;

  • 提供一个产品类的库,所有的产品以同样的接口出现,是的客户端或应用层不依赖于具体实现。

由于开闭原则的倾斜性,适用于产品等级结构稳定的!

4、优点

  • 具体产品在应用层代码隔离,无需关心创建细节;

  • 将一个系列的产品族统一到一起创建。

5、缺点

  • 规定了所有可能被创建的产品集合,扩展新产品困难,需要修改抽象工厂的接口;

  • 增加系统的抽象性和理解难度

  • 开闭原则的倾斜性,对于新增加产品族,只要增加具体产品和工厂,无序修改内部代码,这很好地支持了开闭原则,但是对于新增加产品等级结构,也就是扩展新的产品,需要修改工厂内部代码,甚至修改抽象层的代码,这就违反了开闭原则。

  • 在这里插入图片描述

  • 产品等级与产品族

  • 在这里插入图片描述

  • 在这里插入图片描述

发布了43 篇原创文章 · 获赞 6 · 访问量 3907

猜你喜欢

转载自blog.csdn.net/weixin_44424668/article/details/103259286