抽象工厂模式

抽象工厂模式

等级接口

使用抽象工厂模式的时候,首先需要把同一等级下的不同对象划分出来,我们以后就称其为划分等级,划分等级的过程如下:

首先写一个能够代表这一等级的接口,如下图:

在这里插入图片描述

实现等级接口的抽象类

然后要定义这一等级下不同对象的抽象类,如下图:

在这里插入图片描述

在这里插入图片描述

继承抽象类的族类

根据不同的族,实现抽象类,如下图:

颜色是红色的族,实现抽象类:

在这里插入图片描述

在这里插入图片描述

颜色是蓝色的族实现抽象类:

在这里插入图片描述

在这里插入图片描述

定义抽象工厂

定义一个抽象工厂,如下图:

在这里插入图片描述

定义具体工厂

通过不同的族来创建具体的工厂,如下图:

在这里插入图片描述

在这里插入图片描述

测试

在这里插入图片描述

抽象工厂模式中各个属性的解释

抽象工厂:声明一组用于创建一族产品的方法,比如本例一族产品就代表红色特斯拉,红色五菱宏光,一族即都是红色,产品包含这一等级下的所有的产品,即汽车等级下的特斯拉和五菱宏光。

具体工厂:具体工厂实现了抽象工厂,每个工厂方法返回一个具体对象,一个具体工厂所创建的具体对象构成了一个族如:RedCarFactory这个具体工厂可以创建红色特斯拉,红色五菱宏光。具体工厂可以生产统一系列的所有对象。

抽象类接口:提供一组所有类都具有的业务方法。

抽象类:用于实现抽象类接口所定义的业务方法,但是该角色对于抽象接口定义的方法只做抽象实现,即所有实现都被定义为抽象方法,最终的具体实现全部交给具体类实现。抽象类主要是将统一等级下的不同产品划分结构。

具体类:该角色继承抽象类,不同族的业务方法的实现。

什么时候使用抽象工厂模式呢?

当有很多产品,但是这些产品有共同的特征的时候,就可以使用抽象工厂模式。其中这些共同的特征就是族,比如它们都是红色或蓝色,这些产品就是统一等级下的不同产品,比如汽车等级下的产品:特斯拉,五菱宏光。

抽象工厂模式是不满足开闭原则的

目前我们的程序中,可以获取到红色Red和蓝色Blue两种颜色的特斯拉和五菱宏光车辆,如果现在程序需要拓展了,比如说想要获取到白色White的特斯拉和五菱宏光车辆,那么我们只需要写两个实现类WhiteTesla和WhiteWuLing,其中WhiteTesla实现类实现了Tesla抽象类,而WhiteWuLing实现类实现了WuLing抽象类。最后再写一个WhiteCarFactory工厂实现抽象工厂CarFactory就可以了。这样看似满足开闭原则,即不修改原来的代码,只是在原来的代码之上进行扩展,但是仔细想一想。如果你想要扩展的不是一个族(这里不同的颜色表示不同的族,增加白色,就相当于是扩展一个族),而是扩展的这一等级下的对象,比如说你想要增加一个奥迪车辆,那么你就不得不要修改抽象工厂CarFactory了,需要在里面添加一个奥迪车辆。

抽象工厂模式的优缺点

优点:

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

​ 将一个系列的产品统一到一起创建

缺点:

​ 规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难

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

抽象工厂模式:不可以增加产品,可以增加产品族。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr-X~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值