Java23种设计模式-创建型模式之抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它用于创建相关相互依赖对象的一组,而无需指定具体的类。这种模式特别适用于产品族的情况,即一组相互关联的产品对象

存在四种角色:
角色1:抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的
角色2:具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的
角色3:抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口
角色4:具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。

优点包括:
1.具体产品在应用层代码隔离,无须关心创建细节。
2.将一个系列的产品族统一到一起创建
主要缺点:
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。
增加了系统的抽象性和理解难度。

示例:定义了两个产品接口ProductA和ProductB,以及它们的具体实现ConcreteProductA1和ConcreteProductB1。然后定义了一个工厂接口Factory和一个具体工厂ConcreteFactory,它负责创建产品对象。最后,在客户端代码中,我们通过工厂创建了产品对象并调用它们的方法

//抽象产品A
public interface ProductA {void useProductA();
}
// 具体产品A1
public class ConcreteProductA1 implements ProductA{@Overridepublic void useProductA() {System.out.println("使用产品A1");}
}
//抽象产品B
interface ProductB {void useProductB();
}
//具体产品B1
public class ConcreteProductB1 implements ProductB {@Overridepublic void useProductB() {System.out.println("使用产品B1");}
}
// 抽象工厂
public interface Factory {ProductA createProductA();ProductB createProductB();
}
// 具体工厂
public class ConcreateFactory implements Factory{@Overridepublic ProductA createProductA() {System.out.println("具体产品实例化A1");return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {System.out.println("具体产品实例化B1");return new ConcreteProductB1();}
}
// 客户端调用测试
public class Client {public static void main(String[] args) {//工厂实例化Factory factory = new ConcreateFactory();//工厂调用ProductA productA = factory.createProductA();ProductB productB = factory.createProductB();productA.useProductA();productB.useProductB();}
}

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

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

相关文章

Tiny11作者开源:利用微软官方镜像制作独属于你的Tiny11镜像

微软对Windows 11的最低硬件要求包括至少4GB的内存、双核处理器和64GB的SSD存储。然而,这些基本要求仅仅能保证用户启动和运行系统,而非流畅使用 为了提升体验,不少用户选择通过精简系统来减轻硬件负担,我们熟知的Tiny11便是其中…

【简单介绍下机器学习之sklearn基础】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

【机器学习】深度神经网络(DNN):原理、应用与代码实践

深度神经网络(DNN):原理、应用与代码实践 一、深度神经网络(DNN)的基本原理二、DNN的优缺点分析三、DNN的代码实践四、总结与展望 在人工智能与机器学习的浪潮中,深度神经网络(Deep Neural Netw…

演示在一台Windows主机上运行两个Mysql服务器(端口号3306 和 3307),安装步骤详解

目录 在一台Windows主机上运行两个Mysql服务器,安装步骤详解因为演示需要两个 MySQL 服务器终端,我只有一个 3306 端口号的 MySQL 服务器,所以需要再创建一个 3307 的。创建一个3307端口号的MySQL服务器1、复制 mysql 的安装目录2、修改my.in…

安全开发实战(4)--whois与子域名爆破

目录 安全开发专栏 前言 whois查询 子域名 子域名爆破 1.4 whois查询 方式1: 方式2: 1.5 子域名查询 方式1:子域名爆破 1.5.1 One 1.5.2 Two 方式2:其他方式 总结 安全开发专栏 安全开发实战​​http://t.csdnimg.cn/25N7H 前言 whois查询 Whois 查询是一种用…

MCU功耗测量

功耗测量 一、相关概念二、功耗的需求三、测量仪器仪表测量连接SMU功能SMU性能指标 四、功耗测量注意点板子部分存在功耗MCU方面,可能存在干扰项仪器仪表方面 一、相关概念 静态功耗和动态功耗:动态功耗为运行功耗,功耗测量注重每MHz下的功耗…

DevOps文化对团队有何影响?

DevOps文化对团队有很多积极影响,包括提高团队效率、促进沟通与协作、提高产品质量和推动创新等方面。然而,实施DevOps文化也需要一定的挑战,如改变团队成员的观念、引入新的工具和流程等。因此,团队需要充分了解DevOps文化的价值…

【深度学习】图像修复的一些模型

Mask-Aware Transformer 大空洞修复。 1、图像修复 Introduction 定义 图像修复(Image inpainting、Image completion、image hole-filling)指的是合成图像中缺失区域的过程,可以帮助恢复被遮挡或降质的部分。 在下图中,左图是…

【重磅开源】MapleBoot项目开发规范

基于SpringBootVue3开发的轻量级快速开发脚手架 🍁项目简介 一个通用的前、后端项目模板 一个快速开发管理系统的项目 一个可以生成SpringBootVue代码的项目 一个持续迭代的开源项目 一个程序员的心血合集 度过严寒,终有春日&#xff…

身份证实名认证接口的三种方式、C#实名认证接口

第一种是身份证号实名认证,主要针对证件的二要素信息进行核验,判断姓名和身份证号是否一致;第二种是身份证实名认证,在身份证号实名认证的基础上,增加了身份证头像真伪查验的功能;第三种是身份实名认证&…

macOS - 处理系统更新红点

文章目录 AttentionPrefBundleIDs 是一个字典 <key>AttentionPrefBundleIDs</key><dict><key>com.apple.preferences.softwareupdate</key><integer>1</integer></dict>首先在系统偏好设置中将软件更新中“自动保持我的Mac运行…

计算机网络-IS-IS基础配置实验

前面我们了解了IS-IS的一些基础理论&#xff0c;从建立邻接、链路状态数据库同步以及路由计算&#xff0c;现在开始学习下配置操作。 一、IS-IS配置 网络拓扑图&#xff1a; 拓扑图 IS-IS有Level级别的区分&#xff0c;Level-1可以是性能较低的设备只维护区域内的LSDB&#xff…

设置Mac上Git的多账户配置,用于同时访问GitLab和Gitee

在 Mac 上配置 Git 多账户&#xff08;比如 GitLab 和 Gitee&#xff09;的步骤如下&#xff1a; 1. 生成 SSH 密钥 首先&#xff0c;你需要为每个 Git 服务生成一个 SSH 密钥。在终端中运行以下命令&#xff0c;然后按照提示操作&#xff1a; ssh-keygen -t rsa -C "y…

vue - 路由守卫

Vue路由守卫是一种机制&#xff0c;用于在导航过程中对路由进行监控和控制。Vue Router提供了三种类型的路由守卫&#xff1a; 1. 全局前置守卫&#xff1a;router.beforeEach 2. 全局解析守卫&#xff1a;router.beforeResolve 3. 全局后置守卫&#xff1a;router.afterEac…

远程仓库.github/workflow的 yml如何配置

git 远程仓库.github/workflow的 yml如何配置 关于远程仓库 GitHub 的协作开发方法取决于将本地存储库中的提交发布到 GitHub 以便其他人查看、获取和更新。 远程 URL 是 Git 表达“代码存储位置”的奇特方式。该 URL 可以是您在 GitHub 上的存储库&#xff0c;也可以是其他用…

深入探索CSS3多列布局:重构文本流与网页排版的艺术

在网页设计领域&#xff0c;CSS3的多列布局&#xff08;Multicolumn Layout&#xff09;是一项革命性的改进&#xff0c;它赋予了设计师们创作类似报纸或杂志般的多栏布局的能力。本文将全面解析CSS3中与多列布局相关的属性&#xff0c;深入探讨其工作原理&#xff0c;并结合实…

Mybatis入门,day2,动态SQL

Mybatis入门&#xff0c;day2&#xff0c;动态SQL 文章目录 Mybatis入门&#xff0c;day2&#xff0c;动态SQL前言一、为什么要实现动态SQL二、使用步骤1.where和if2.set和if3.foreach方法 前言 动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中&#xff0c;开…

《R语言与农业数据统计分析及建模》学习——描述性统计分析

一、描述性统计概念和方法 1、概念和作用 描述性统计是对数据进行概括和描述&#xff0c;便于理解数据的特征、趋势和分布&#xff0c;帮助我们了解数据基本情况和总体特征&#xff0c;为后续更深入的数据分析和建模提供基础。 2、基础方法 &#xff08;1&#xff09;中心趋…

npm、yarn与pnpm详解

&#x1f525; npm、yarn与pnpm详解 &#x1f516; 一、npm &#x1f50d; 简介&#xff1a; npm是随Node.js一起安装的官方包管理工具&#xff0c;它为开发者搭建了一个庞大的资源库&#xff0c;允许他们在这个平台上搜索、安装和管理项目所必需的各种代码库或模块。 &#…

CountDownLatch源码分析

1.创建 CountDownLatch latch new CountDownLatch(5); 2.latch.countDown(); 将count执行减一操作&#xff0c;当count为0时&#xff0c;等待中的线程会被唤醒 SIGNAL (值为-1)&#xff1a; 表示后继节点需要被唤醒。当一个节点释放锁的时候&#xff0c;会唤醒它的后继节点…