设计模式-----抽象工厂模式

来源:互联网 发布:linux 删除文件内容 编辑:程序博客网 时间:2024/06/04 20:04

抽象工厂模式

工厂模式改为抽象工厂

在上面的工厂方法中我们举例,女娲造人的例子,但是我们想要加上性别,为此重新建模:

这里写图片描述

Human接口中提供getSex的方法,我们将BlackHuman改为抽象类同时提供实现Human接口中的方法,在下方我们提供Female与MaleBlackMan的实现类,分别表示男性以及女性黑人。在工厂类的接口中我们依然提供创建人类对象的方法,在具体实现FemaleFactory与MaleFactory中提供创建女性工厂以及男性工厂。

在上面的重构中,我们把工厂有具体的进行了划分,分为男性工厂以及女性工厂,可以比作工厂中的车间,每个车间负责不同的职责。

抽象工厂模式的定义

为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类

这里写图片描述

抽象工厂模式是工厂模式的升级版本,在多个业务品种以及业务分类时,采用抽象工厂模式是需要对象的一种非常好的解决方法。

这里写图片描述

我们可以看到在AbstractCreaor中提供创建两个产品的抽象方法,然后在Creator1与Creator2中提供具体的实现只生产1类产品与只生产2类产品。

对应上文我们的重构,在HumanFactory中我们提供创建各个人种的抽象方法,在底层的实现,提供只产生女性与男性的工厂类。

抽象工厂模式优点

  1. 封装性——–在高层模块中,不需要关系具体对象的创建方法
  2. 产品族内的约束为非公开状态——–比如我们要求生产一个女性就生产一个男性,而这样的约束封装在底层中,上层无须知道。

抽象工厂模式缺点

抽象工厂模式的最大缺点就是产品族扩展非常困难,比如我们需要添加C类产品,那么不仅仅需要添加具体实现,而且需要更改具体的接口,违反了开闭原则

抽象工厂模式注意

在抽象工厂中缺点中我们提到扩展产品族比较困难,但是如果我们横向扩展,扩展产品的中类,那么就比较简单,比如我们在性别中添加双性人,那么只需要增加双性人的实现,然后在工厂中增加双性人工厂的具体实现即可

因此抽象工厂非常适合横向扩展,而不适合纵向扩展。

抽象工厂模式与工厂模式

在抽象工厂模式的通用UML图中,我们把AbstractProdcut2去掉,发现,其实就是工厂模式的细分。因此我们可以认为抽象工厂模式与工厂模式最本质的区别就是可以生成出不同类别的产品。

当我们去咖啡店买咖啡时,我们用工厂模式生产咖啡没有什么问题。

但是如果我们不忽略细节,比如我们需要奶、糖等等,那么我们如果采用工厂模式生产出苦苦的咖啡,如果采用抽象工厂模式,我们不仅仅可以生产出美味的咖啡,同时还可以按照客户的要求来实现是否需要加糖。

0 0
原创粉丝点击