设计模式之死磕抽象工厂模式(原创)

简介: 之前提到过工厂模式仔细区分的话分为三种,分别是简单工厂模式、工厂方法模式以及抽象工厂模式。在上面已经介绍完了工厂模式和工厂方法模式。本篇文章主要学习的是工厂模式的第三种,抽象工厂模式。

之前提到过工厂模式仔细区分的话分为三种,分别是简单工厂模式、工厂方法模式以及抽象工厂模式。在上面已经介绍完了工厂模式和工厂方法模式。本篇文章主要学习的是工厂模式的第三种,抽象工厂模式。

注:本文是基于 设计模式之工厂模式 以及 设计模式之工厂方法模式 的文章基础之上进行编码以及项目说明。

首先,什么是抽象工厂模式?

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态(名字的定义就可以看出)。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的对象(工厂模式的本质)。但是这种模式下,它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类;一个抽象工厂类,可以派生多个具体工厂类,每个具体的工厂类可以创建多个产品类的实例。每一个模式都是针对一定问题的解决方案。工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结果。

下面我们就用代码去描述抽象工厂模式:

之前说到,联盟内的英雄有姓名还有对应的技能,按照面向对象的思想我们可以将英雄的名字和英雄的技能单独抽取出来,成为一个顶层的规范(也就是上面概念中提到的 多个抽象角色)。那么我们就可以有以下代码:

img_fe001d35cc4b232317a5bbefa7bf48d3.png
抽象角色 - 1

首先定义第一个抽象角色,也就是英雄的顶层接口,接着我们定义具体的实现类(依旧跟前面两篇文章一样,定义三个实现类)

img_372c2b0ac2c0715c18ea10678cf4273c.png
hero - 1
img_f152488f99f877bc28c9fa9e3557955e.png
hero - 2
img_28ce36afe5cccc35d63ec36e042f4532.png
hero - 3

同理,我们在定义第二个抽象角色,就是技能的行为规范(也就是接口)

img_c88c878c0ab97144d7a61fe8684f4e86.png
抽象角色 - 2

接着定义技能接口的实现类,(这里将三个代码截图全部放在一个实现类里面了)

img_57b2b6bf678e8db18072fb00d4b8b74e.png
技能概览

根据上面的概念,我们定义完了2个抽象角色,那么还需定义一个抽象工厂。可能你会问为什么要定义一个抽象工厂,因为上面的概念也说到了定义抽象工厂的目的就是为了派生具体的工厂类(也就是让子类去实现)。这个抽象工厂类加上abstract 关键字后,又该如何去写内部的逻辑,我想这个才是最需要思考和解决的问题。

仔细思考以后,其实我们可以这样去分析,因为这个抽象工厂的本质就是让子类去实现功能的,子类具体实现的功能其实就是将上面定义的抽象角色给实例化(提供出去),但是我们一般不会在抽象类去这样操作(这样就失去了抽象的意义)所以,这个抽象工厂的内部逻辑其实就是提供 抽象角色对应的抽象方法供子类去实现,也就是

img_9f3cf25bdab0be8d7016c30e2ac11eca.png
抽象工厂

定义完抽象工厂以后,我们就可以根据抽象工厂模式的定义去派生具体的工厂类。上面也说到每个具体的工厂类可以创建多个产品类的实例,那么我们就根据抽象角色去定义两个继承了抽象工厂的不同的工厂。

img_27f63ac5d632bfd92b339218ded40bb1.png
英雄工厂

定义完英雄工厂后我们在定义技能工厂(对应的是抽象角色的中的技能角色)

img_26d669ce9f1dc1f0b24f5c8e596c9f53.png
技能工厂

那么,两个具体的实例工厂我们也已经定义完毕了,现在可以定义一个管理类统一管理这2个工厂(代码逻辑如图)

img_e9cb8541326ec97bc2dc4d5f05d7e9e8.png
管理实例化的工厂

上面的内容基本上就把抽象工厂介绍完毕了,下面开始抽象工厂的代码测试:

img_af38ebc9be89aadc56807684a2c06bfc.png
测试结果

其中红色矩形代表的是英雄工厂,蓝色矩形代表的是技能工厂,console里面的结果也是根据上面截图颜色进行对应展示的。

抽象工厂模式的优缺点:

优点:这种模式是针对“新系列”的需求变化。分离了具体的类,抽象工厂模式帮助开发者控制一个应用创建的对象的类,因为一个(实例)工厂封装创建产品对象的责任和过程。它将使用者和类的实现进行分离,使用者通过他们的抽象接口进行自定义逻辑的实例操作;其次,这种模式创建了一个完整的对象系列(上面的英雄和技能),这样利于对象的一致性(牵一发动全身)。所以,当一系列的对象被设计成一起工作或者一个应用一次只能使用同一个系列中的对象,使用抽象工厂模式就非常满足这种应用场景。

缺点:代码量相对简单工厂模式、工厂方法模式较大;难以支持新种类的产品(也就是抽象角色),因为抽象工厂已经确定了创建的产品集合(抽象方法),如果添加新的抽象方法或者接口,所有实现了该抽象工厂的子类就都会有影响

关于抽象工厂模式的内容基本上就介绍完毕了。可能你有点云里雾里,下面会对三种工厂模式进行总结说明,方便我们记忆和使用。

简单工厂模式、工厂方法模式以及抽象工厂模式的总结:

工厂模式:

专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有相同的父类。本质是通过工厂类的传入的参数(不同对象的标识)动态决定应该创建那一个产品类。这种模式下工厂类是整个模式的核心它包含必要的逻辑判断,创建实例的判断等。外部无需了解这些对象如何创建以及如何组织的,这有利于结构优化。

这种模式适用于工厂类负责创建的对象比较少,只需要知道传入工厂类的参数,对于如何创建并不关心。

工厂方法模式:

这种模式是对工厂模式的一种优化升级,解决了工厂模式下的开闭问题。本质是在工厂和产品之间增加接口,工厂不再负责产品的创建,由接口针对不同的条件返回具体的对象实例。有一个抽象的工厂类,具体的逻辑有子类去完成,这种模式下工厂类和产品类往往可以依次对应(即一个抽象工厂对应一个抽象产品)。这种模式拓展性强,解决了开闭问题,关系对应性强。

适用于当一个类不知道它所必须创建对象的类或者一个类希望由子类来指定它所创建的对象时;当类将创建的需的职责委托给帮助类中的某一个,并且希望得到指定帮助类的信息,可以使用工厂方法模式

抽象工厂模式:

抽象工厂模式的概念上面也说到了,这是当有多个抽象角色时使用的一种工厂模式。这种模式下,它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类;一个抽象工厂类,可以派生多个具体工厂类,每个具体的工厂类可以创建多个产品类的实例。每一个模式都是针对一定问题的解决方案。工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结果。

参考资料:百度百科

如果这篇文章对你有帮助,希望各位看官留下宝贵的star,谢谢。

Ps:著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请添加转载出处,添加原文url地址),文章请勿滥用,也希望大家尊重笔者的劳动成果。

相关文章
|
6月前
|
设计模式 C++
设计模式之抽象工厂模式(C++)
设计模式之抽象工厂模式(C++)
|
6月前
|
设计模式
设计模式~抽象工厂模式-04
抽象工厂 优点 缺点 使用场景 为创建一组相
29 0
|
4月前
|
设计模式 Java
Java设计模式【三】:抽象工厂模式
Java设计模式【三】:抽象工厂模式
18 0
|
7月前
|
设计模式
设计模式~~~抽象工厂模式
设计模式~~~抽象工厂模式
28 0
|
15天前
|
设计模式 Java Windows
23种设计模式,抽象工厂模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建相关或依赖对象的家族,而不需要指定具体类。该模式允许客户端在不知道具体类的情况下,通过其共同的接口来创建一组产品。
27 7
|
3月前
|
设计模式 Oracle 关系型数据库
设计模式 | 抽象工厂模式
设计模式 | 抽象工厂模式
22 0
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——02抽象工厂模式
Golang设计模式——02抽象工厂模式
21 0
|
8月前
|
设计模式 Java 数据库连接
Java设计模式之抽象工厂模式:创造多个相关对象
在软件开发领域,设计模式是一种用于解决常见问题的实践方法,它提供了一些被验证过的指导原则。抽象工厂模式是创建型设计模式中的佼佼者,可以帮助我们在处理多个相关对象的创建时保持一致性。让我们深入了解抽象工厂模式的内涵以及它如何在Java中应用。
61 0
|
3月前
|
设计模式 前端开发
【设计模式】之抽象工厂模式
抽象工厂模式是一种创建型设计模式,适用于需要创建一系列相关或相互依赖对象的场景。在前端开发中,抽象工厂模式可以帮助我们更好地组织和管理代码,提高代码的可维护性和可扩展性。它通过封装对象的创建过程,使得客户端代码与具体类解耦,并且可以通过切换具体工厂类来改变整个系统的行为。然而,它也增加了系统的复杂度,并且当产品族较多时会导致大量的具体工厂类。因此,在使用抽象工厂模式时需要权衡利弊,并根据实际情况进行选择。
53 0
【设计模式】之抽象工厂模式
|
3月前
|
设计模式 NoSQL 中间件
设计模式 - 创建型模式_抽象工厂模式
设计模式 - 创建型模式_抽象工厂模式
21 0