二十三种设计模式全面解析-抽象工厂模式:创造无限可能的工厂之道


在软件开发中,我们经常面临着创建一系列相关或相互依赖的对象的挑战。在这个过程中,我们希望能够灵活地创建对象,又不与具体的类耦合。那么有没有一种设计模式可以帮助我们实现这一目标呢?答案是肯定的!让我带你进入抽象工厂模式的世界,一起探索创造无限可能的工厂之道。


抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定具体的类。它通过引入抽象工厂接口和抽象产品接口,实现了对象的创建与使用的分离。


首先,让我们来了解抽象工厂模式的核心组成部分。抽象工厂模式由以下几个角色组成:

  1. 抽象工厂(Abstract Factory):定义了一组创建产品的方法,每个方法对应一个抽象产品。

  2. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体的产品。

  3. 抽象产品(Abstract Product):定义了产品的接口,具体产品需要实现这个接口。

  4. 具体产品(Concrete Product):实现了抽象产品接口,是抽象工厂创建的目标对象。


抽象工厂模式的核心思想是将对象的创建过程封装在工厂类中,客户端只需要通过抽象工厂接口来创建产品,而无需关心具体的产品类。这种解耦的设计使得系统更加灵活和可扩展。


为了更好地理解抽象工厂模式,让我们通过一个案例来演示它的应用。


假设我们正在开发一个游戏,游戏中有两个种类的角色:战士(Warrior)和法师(Mage)。每个角色都有武器(Weapon)和盔甲(Armor)。现在我们希望能够根据不同的种类创建对应的角色和装备。

首先,我们定义抽象产品接口:

// 抽象武器接口
public interface Weapon {void attack();
}// 抽象盔甲接口
public interface Armor {void defend();
}

接下来,我们定义具体的产品类,实现抽象产品接口:

// 具体武器类:剑
public class Sword implements Weapon {@Overridepublic void attack() {System.out.println("使用剑进行攻击!");}
}// 具体武器类:魔杖
public class Staff implements Weapon {@Overridepublic void attack() {System.out.println("使用魔杖进行攻击!");}
}// 具体盔甲类:重甲
public class HeavyArmor implements Armor {@Overridepublic void defend() {System.out.println("穿上重甲进行防御!");}
}// 具体盔甲类:轻甲
public class LightArmor implements Armor {@Overridepublic void defend() {System.out.println("穿上轻甲进行防御!");}
}

然后,我们定义抽象工厂接口:
// 抽象工厂接口
public interface CharacterFactory {Weapon createWeapon();Armor createArmor();
}

接着,我们实现具体的工厂类,实现抽象工厂接口:
// 战士工厂
public class WarriorFactory implements CharacterFactory {@Overridepublic Weapon createWeapon() {return new Sword();}```java@Overridepublic Armor createArmor() {return new HeavyArmor();}
}// 法师工厂
public class MageFactory implements CharacterFactory {@Overridepublic Weapon createWeapon() {return new Staff();}@Overridepublic Armor createArmor() {return new LightArmor();}
}

最后,我们可以在客户端代码中使用抽象工厂模式来创建角色和装备:
public class Client {public static void main(String[] args) {CharacterFactory warriorFactory = new WarriorFactory();CharacterFactory mageFactory = new MageFactory();Weapon warriorWeapon = warriorFactory.createWeapon();Armor warriorArmor = warriorFactory.createArmor();Weapon mageWeapon = mageFactory.createWeapon();Armor mageArmor = mageFactory.createArmor();warriorWeapon.attack();warriorArmor.defend();mageWeapon.attack();mageArmor.defend();}
}

在上述代码中,我们使用了抽象工厂模式来创建战士和法师的角色和装备。通过不同的具体工厂,我们可以创建出战士使用剑和重甲的角色,以及法师使用魔杖和轻甲的角色。客户端代码无需知道具体的产品类,只需要通过抽象工厂接口来创建产品。
总结:

抽象工厂模式是一种强大的设计模式,它可以帮助我们创建一系列相关或相互依赖的对象,而无需关心具体的实现细节。通过使用抽象工厂模式,我们可以更加灵活地扩展系统,添加新的产品系列,而不会影响到现有的代码。现在,你是否已经迫不及待地想要在自己的项目中尝试使用抽象工厂模式了呢?让我们一起探索更多设计模式的奥秘吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/124637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DIY相机(一)libcamera库

相机选型 DIY相机首先是要确定使用的相机型号。兼容树莓派,画质好一些的,目前主要有两款:一是Raspberry Pi Camera Module 3,二是Raspberry Pi HQ Camera。 下图是Raspberry Pi Camera Module 3的相关特性。支持自动对焦和HDR等…

GNU 链接器(ld) -ldmain.c的执行过程

1. 获取程序的启动时间 long start_time get_run_time () 2. 获取程序的内存堆(heap)的起始地址 char *start_sbrk (char *) sbrk (0); char *start_sbrk (char *) sbrk(0); 这行代码用于获取程序的内存堆(heap)的起始地址。…

搜索与图论:染色法判定二分图

将所有点分成两个集合,使得所有边只出现在集合之间,就是二分图 二分图:一定不含有奇数个点数的环;可能包含长度为偶数的环, 不一定是连通图 染色可以使用1和2区分不同颜色,用0表示未染色 遍历所有点&…

Linux命令(109)之md5sum

linux命令之md5sum 1.md5sum介绍 linux命令md5sum是用来计算和校验文件的MD5值。 另外: md5sum是用来校验文件内容,与文件名是否相同无关 md5sum校验文件时,逐位校验,如果文件越大,校验所需时间就越长 2.md5sum用…

python随手小练14

题目: 文件操作 : 根据文件要求(测试)筛选出数据并且放入一个新的文件 具体操作: f1 open("1.txt","r",encoding"UTF-8") f2 open("2.txt","w",encoding"U…

Centos7 部署 Stable Diffusion

参考:https://www.jianshu.com/p/ff81bb76158a 遇到的问题: 1、git clone 比较慢 解决办法:设置代理 https://blog.csdn.net/dszgf5717/article/details/130735389 2、pip install 比较慢 解决办法:更换源或设置代理 https:/…

软考系统架构师知识点集锦八:嵌入式系统

一、考情分析 二、考点精讲 2.1嵌入式系统概述 2.1.1基本概念 (1)嵌入式系统是以应用为中心、以计算机技术为基础,并将可配置与可裁剪的软、硬件集成于一体的专用计算机系统,需要满足应用对功能、可靠性、成本、体积和功耗等方面的严格要求。 (2)从计算机角度看,嵌…

轻量封装WebGPU渲染系统示例<8>- 渲染器基本场景管理(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/RSceneTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5. 用户操作和渲…

数据结构:算法(特性,时间复杂度,空间复杂度)

目录 1.算法的概念2.算法的特性1.有穷性2.确定性3.可行性4.输入5.输出 3.好算法的特质1.正确性2.可读性3.健壮性4.高效率与低存储需求 4.算法的时间复杂度1.事后统计的问题2.复杂度表示的计算1.加法规则2.乘法规则3.常见函数数量级比较 5.算法的空间复杂度1.程序的内存需求2.例…

SpringBoot通过注解形式实现系统操作日志

介绍 我们在日常开发工作中,肯定逃不开与日志接触,一些比较严谨的后台管理系统里面会涉及到一些比较重要的资料,有些公司为了知道有哪些人登录了系统,是谁在什么时候修改了用户信息或者资料,所以就有了操作日志这么个…

1.4 安全服务

思维导图: 1.4 安全服务 定义:在通信开放系统中,为系统或数据传输提供足够安全的协议层服务。 RFC4949 定义:由系统提供的对系统资源进行特殊保护的处理或通信服务。安全服务通过安全机制来实现安全策略。 分类:X.800 …

Flink将数据写入MySQL(JDBC)

一、写在前面 在实际的生产环境中&#xff0c;我们经常会把Flink处理的数据写入MySQL、Doris等数据库中&#xff0c;下面以MySQL为例&#xff0c;使用JDBC的方式将Flink的数据实时数据写入MySQL。 二、代码示例 2.1 版本说明 <flink.version>1.14.6</flink.version…

故障诊断模型 | Maltab实现BiLSTM双向长短期记忆神经网络故障诊断

文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现BiLSTM双向长短期记忆神经网络故障诊断 模型描述 利用各种检查和测试方法,发现系统和设备是否存在故障的过程是故障检测;而进一步确定故障所在大致部位的过程是故障定位。故障…

Linux网络编程二(TCP三次握手、四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

TCP三次握手 TCP三次握手(TCP three-way handshake)是TCP协议建立可靠连接的过程&#xff0c;确保客户端和服务器之间可以进行可靠的通信。下面是TCP三次握手的详细过程&#xff1a; 假设客户端为A&#xff0c;服务器为B 1、第一次握手&#xff08;SYN1&#xff0c;seq500&…

C语言修行之函数篇(二)strcasecmp,strncasecmp —— 比较字符串字符

文章目录 函数说明函数声明函数参数函数实现函数实例 函数说明 strcasecmp()函数对字符串s1和s2执行逐字节比较&#xff0c;忽略字符的大小写。如果发现s1分别小于、匹配或大于s2&#xff0c;则返回一个小于、等于或大于0的整数。 函数声明 #include <strings.h> int s…

03_Flutter自定义下拉菜单

03_Flutter自定义下拉菜单 在Flutter的内置api中&#xff0c;可以使用showMenu实现类似下拉菜单的效果&#xff0c;或者使用PopupMenuButton组件&#xff0c;PopupMenuButton内部也是使用了showMenu这个api&#xff0c;但是使用showMenu时&#xff0c;下拉面板的显示已经被约定…

List的add(int index,E element)陷阱,不得不防

项目场景&#xff1a; 项目中有两个List列表&#xff0c;一个是List1用来存储一个标识&#xff0c;后续会根据这个标识去重。 一个List2是用来返回对象的&#xff0c;其中对象里也有一个属性List3。现需要将重复的标识数据追加到List3 我想到的两个方案&#xff1a; 尽量不动…

吴恩达《机器学习》2-5->2-7:梯度下降算法与理解

一、梯度下降算法 梯度下降算法的目标是通过反复迭代来更新模型参数&#xff0c;以便最小化代价函数。代价函数通常用于衡量模型的性能&#xff0c;我们希望找到使代价函数最小的参数值。这个过程通常分为以下几个步骤&#xff1a; 初始化参数&#xff1a; 随机或设定初始参数…

项目资源管理-考试重点

1. 冲突管理的5种方法 ① 撤退/回避 ② 缓和/包容 ③ 妥协/调解 ④ 强迫/命令 ⑤ 合作/解决问题 2. 虚拟团队的优缺点 优点&#xff1a; ① 能够利用不在同一地理区域的专家的专业技术 ② 将在家办公的员工纳入团队 ③ 以及将行动不便者或残疾人纳入团队 缺点&#…

【图像分类】基于计算机视觉的坑洼道路检测和识别(ResNet网络,附代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 本篇博文,我们将使用PyTorch深度学习框架搭建ResNet实现钢轨缺陷识别,附完整的项目代码和数据集,可以说是全网…