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

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

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

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

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

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

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

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

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地址),文章请勿滥用,也希望大家尊重笔者的劳动成果。

相关文章
|
7月前
|
设计模式 Java 关系型数据库
【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)
一、入门 什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。 简单来说,抽象工厂模式是工厂方法模式的升级版,它能够创建一组相
246 14
|
设计模式 PHP
php设计模式--抽象工厂模式(二)
php设计模式--抽象工厂模式(二)
91 0
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
196 5
|
11月前
|
设计模式
「全网最细 + 实战源码案例」设计模式——抽象工厂模式
抽象工厂模式是一种创建型设计模式,提供接口用于创建一系列相关或依赖的对象,无需指定具体类。它解决了产品族问题,管理和创建一组相关产品。结构上包括抽象工厂、具体工厂、抽象产品和具体产品。适用于创建相关对象、产品族固定但种类变化的场景。优点是分离接口与实现、管理产品族方便且扩展性好;缺点是产品族扩展困难且代码复杂度增加。通过配置文件和反射机制可进一步改进,使系统更灵活易扩展。
229 17
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
146 2
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
392 4
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
119 1
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
139 1

热门文章

最新文章