当前位置: 首页 > news >正文

23种设计模式之抽象工厂模式

目录

什么是抽象工厂模式

基本结构 

基本实现步骤 

实现代码(有注释)

应用场景 

 简单工厂、工厂方法、抽象工厂的区别


什么是抽象工厂模式

抽象工厂模式也是一种创建型设计模式,提供了一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象⼯⼚模式可以确保⼀系列相关的产品被⼀起创建,这些产品能够相互配合使⽤。比如说有书包、托特包都有皮质包和帆布包两类型的包,可以将生产皮质包的放在一个工厂里,生产帆布包的放在另一个工厂里,这样一个工厂就可以生产一系列同类型的包。

基本结构 

  • 抽象产品接口:定义产品的接口,可以定义多个抽象产品接口,如书包、托特包
  • 具体产品类:实现抽象产品接口,是产品的具体体现,如皮质书包、帆布书包
  • 抽象工厂类:声明一组用于创建产品的方法,每个方法对应一个产品
  • 具体工厂类:实现抽象工厂接口,负责创建一组具体产品对象。

基本实现步骤 

  1. 定义抽象产品接口,接口中声明产品的公共方法。
  2. 实现具体产品类,在类中实现抽象产品接口中的方法。
  3. 定义抽象工厂接口,声明一组用于创建产品的方法。
  4. 实现具体工厂类,分别用于实现抽象工厂接口中的方法,每个方法负责创建一组相关的产品。
  5. 在客户端中使用抽象工厂及抽象产品创建产品。

实现代码(有注释)

// 定义抽象产品接口
interface productA{void show();
}
interface productB{void buy();
}
//实现具体产品类
class productA1 implements productA{@Overridepublic void show() {System.out.println("it is A1");}
}
class productA2 implements productA{@Overridepublic void show() {System.out.println("it is A2");}
}
class productB1 implements productB{@Overridepublic void buy() {System.out.println("it is B1");}
}
class productB2 implements productB{@Overridepublic void buy() {System.out.println("it is B2");}
}
//定义抽象工厂接口
interface AbstractFactory{productA createProductA();productB createProductB();
}
//实现具体工厂类
class factory1 implements AbstractFactory{@Overridepublic productA createProductA() {return new productA1();}@Overridepublic productB createProductB() {return new productB1();}
}
class factory2 implements AbstractFactory{@Overridepublic productA createProductA() {return new productA2();}@Overridepublic productB createProductB() {return new productB2();}
}
//客户端代码
public class AbstractFactoryExample {public static void main(String[] args) {
//        使用工厂1创建产品A1和B1AbstractFactory factory1=new factory1();productA productA1=factory1.createProductA();productB productB1=factory1.createProductB();productA1.show();productB1.buy();
//        使用工厂2创建产品A2和B2AbstractFactory factory2=new factory2();productA productA2=factory2.createProductA();productB productB2=factory2.createProductB();productA2.show();productB2.buy();}
}

应用场景 

抽象⼯⼚模式能够保证⼀系列相关的产品⼀起使⽤,并且在不修改客户端代码的情况下,可以⽅便地替换整个产品 系列。但是当需要增加新的产品类时,除了要增加新的具体产品类,还需要修改抽象⼯⼚接⼝及其所有的具体⼯⼚ 类,扩展性相对较差。因此抽象⼯⼚模式特别适⽤于⼀系列相关或相互依赖的产品被⼀起创建的情况。

 简单工厂、工厂方法、抽象工厂的区别

  • 简单工厂 模式:一个工厂方法创建所有的产品
  • 工厂方法模式:一个工厂方法创建一个具体产品
  • 抽象工厂模式:一个工厂方法可以创建一类具体产品

相关文章:

23种设计模式之抽象工厂模式

目录 什么是抽象工厂模式 基本结构 基本实现步骤 实现代码(有注释) 应用场景 简单工厂、工厂方法、抽象工厂的区别 什么是抽象工厂模式 抽象工厂模式也是一种创建型设计模式,提供了一系列相关或相互依赖对象的接口,而无需…...

飞天使-linux操作的一些技巧与知识点9-zabbix6.0 容器之纸飞机告警设置

文章目录 zabbix 告警纸飞机方式webhook 方式 告警设置 zabbix 告警纸飞机方式 第一种方式参考 https://blog.csdn.net/yetugeng/article/details/99682432bash-4.4$ cat telegram.sh #!/bin/bashMSG$1TOKEN"61231432278:AAsdfsdfsdfsdHUxBwPSINc2kfOGhVik" CHAT_I…...

京东组件移动端库的使用 Nut-UI

1.介绍 NutUI NutUI-Vue 组件库,基于 Taro,使用 Vue 技术栈开发小程序应用,开箱即用,帮助研发快速开发用户界面,提升开发效率,改善开发体验。 特性 🚀 80 高质量组件,覆盖移动端主…...

用Python来实现2024年春晚刘谦魔术

简介 这是新春的第一篇,今天早上睡到了自然醒,打开手机刷视频就被刘谦的魔术所吸引,忍不住用编程去模拟一下这个过程。 首先,声明的一点,大年初一不学习,所以这其中涉及的数学原理约瑟夫环大家可以找找其…...

TestNG基础教程

TestNG基础教程 一、常用断言二、执行顺序三、依赖测试四、参数化测试1、通过dataProvider实现2、通过xml配置(这里是直接跑xml) 五、testng.xml常用配置方式1、分组维度控制2、类维度配置3、包维度配置 六、TestNG并发测试1、通过注解来实现2、通过xml来…...

###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 一. 两个主要软件的介绍 1.KeiluVision5软件 Keil uVision5是一款集成开发…...

Android 9.0 任务栏中清除掉播放器的进程,状态栏仍有音乐播放器状态问题的解决

1.概述 在9.0的rom定制化开发中,在点击系统自带的播放器以后,播放音乐的时候,在最近任务栏recents列表中,点击全部清除,发现音乐播放器还在播放音乐,导致出现bug,完整的 解决方法,肯定是需要点击全部清除以后,音乐播放器也被杀掉进程,接下来分析下这个移除任务栏流程…...

【笔记】Helm-5 Chart模板指南-13 调是模版

调试模板 调试模板可能很棘手,因为渲染后的模板发送了kubernetes API server,可能会以格式化以外的原因拒绝YAML文件。 以下命令有助于调试: 1、helm lint 是验证chart是否遵循最佳实践的首选工具。 2、helm template --debug在本地测试渲…...

Gateway反向代理配置

前言 一般而言,反向代理都是在Nginx中来实现的,其实Gateway也可以作为反向代理服务,不过一般不会这么做,只不过最近的项目,在通过Nginx反向代理之后,iPhone手机访问接口代理地址会异常,安卓手机…...

HiveSQL——共同使用ip的用户检测问题【自关联问题】

注:参考文章: SQL 之共同使用ip用户检测问题【自关联问题】-HQL面试题48【拼多多面试题】_hive sql 自关联-CSDN博客文章浏览阅读810次。0 问题描述create table log( uid char(10), ip char(15), time timestamp);insert into log valuesinsert into l…...

猫头虎分享已解决Bug ‍ || 修改mongodb3.0副本集用户密码遇到 BeanDefinitionParsingException

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …...

如何将ChatGPT升级到4.0版本?如何充值?

如何将ChatGPT升级到4.0版本? 在人工智能的世界里,每一个升级都可能带来革命性的变革。ChatGPT的4.0版本无疑是当前最炙手可热的话题之一,那么如何进行升级,体验到这一版所带来的全新特性呢?以下是一步一步的指南。 …...

conda 相关命令

创建并激活环境:打开终端,并创建一个新的conda环境,以确保安装的软件与M1芯片兼容。运行以下命令: conda create -n myenv python这将创建一个名为"myenv"的新环境,并安装Python。然后,激活该环境…...

探索现代Web前端开发框架:选择最适合你的工具

在当今快速发展的Web开发领域,前端开发框架的选择显得尤为关键。这些框架可以帮助我们更高效地构建出交互性强、性能卓越的用户界面。本文将带你了解几个当前最受欢迎的Web前端开发框架,并帮助你根据自己的需求选择最合适的工具。 1. React React由Fac…...

记录一下,我使用stm32实现pwm波输入,以及对频率和占空比的计算,同时通过串口输出(实现-重要)

1,首先看下半物理仿真 看下我的配置: 看下计算方法以及matlab的仿真输出的数据: timer3的ch2是选择高电平,计算频率 timer3的ch1是选择的是低电平,用来计算周期 其中TemPIpre表示的是CH2输出的值, TemPI…...

Spring Cloud使用ZooKeeper作为注册中心的示例

简单的Spring Cloud应用程序使用ZooKeeper作为注册中心的示例&#xff1a; 1.新建模块&#xff1a; 2.勾选依赖&#xff1a; 3.在pom.xml文件中做出部分修改及添加Spring Cloud Zookeeper 依赖版本&#xff1a; 完整pom文件 <?xml version"1.0" encoding&q…...

【项目日记(九)】项目整体测试,优化以及缺陷分析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…...

JavaScript 设计模式之外观模式

外观模式 我们为啥要使用外观模式呢&#xff0c;其实我们在使用各种 js 库的时候常常会看到很多的外观者模式&#xff0c;也正是这些库的大量使用&#xff0c;所以使得兼容性更广泛&#xff0c;通过外观者模式来封装多个功能&#xff0c;简化底层操作方法 const A {g: functi…...

一、基础数据结构——2.队列——3.双端队列和单调队列2

参考资料&#xff1a;《算法竞赛》&#xff0c;罗勇军 郭卫斌 著 本博客作为阅读本书的学习笔记&#xff0c;仅供交流学习。 建议关注 罗勇军老师博客 3. 单调队列与最大子序和问题 不限制子序列长度问题——贪心法或动态规划 HDOJ 1003 MAX SUM Max Sum Time Limit: 2000/10…...

Stable Diffusion 模型下载:Samaritan 3d Cartoon(撒玛利亚人 3d 卡通)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十...

Harness设计——Anthropic实战:规划器、生成器、评估器三角色协作详解

Harness 设计是实现智能体编码前沿性能的关键。本文介绍了Anhtropic如何推动 Claude 在前端设计和长期自主软件开发方面更进一步。 有两个相互关联的问题: 让 AI Agent 生成高质量的前端设计。 让它无需人工干预就能构建完整的应用程序。 这项工作源于我们早期在前端设计技能…...

分块技术全解析:长上下文没有杀死它,反而让它成了 RAG 的核心命门

随着 GPT-4o、Claude 3.7 等大模型将上下文窗口推至百万 Token 级别&#xff0c;行业里出现了一种极具误导性的声音&#xff1a;“长上下文已经让文本分块&#xff08;Chunking&#xff09;技术彻底过时了”。但现实恰恰相反&#xff0c;长上下文不仅没有淘汰分块&#xff0c;反…...

终极指南:用Kronos金融大模型5步构建你的量化交易系统

终极指南&#xff1a;用Kronos金融大模型5步构建你的量化交易系统 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos Kronos是首个专为金融市场设计的开源基础…...

ComfyUI-KJNodes:重构AI创作工作流的效率革命

ComfyUI-KJNodes&#xff1a;重构AI创作工作流的效率革命 【免费下载链接】ComfyUI-KJNodes Various custom nodes for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-KJNodes 一、挑战引入&#xff1a;当AI创作遇上效率瓶颈 在AI图像创作领域&#xf…...

刚学单片机的小白,聊聊我的学习目标和职业期待

大家好&#xff0c;我是一名智能科学与技术专业的大二学生&#xff0c;目前刚刚开始接触单片机&#xff0c;还是个实打实的小白。开这篇博客&#xff0c;主要是想记录自己的学习历程&#xff0c;也希望能和同样入门的同学一起交流、互相鼓励。一、自我介绍我目前大二&#xff0…...

如何高效使用PDF-Guru:5种实用PDF处理技巧与完整操作指南

如何高效使用PDF-Guru&#xff1a;5种实用PDF处理技巧与完整操作指南 【免费下载链接】PDF-Guru A Multi-purpose PDF file processing tool with a nice UI that supports merge, split, rotate, reorder, delete, scale, crop, watermark, encrypt/decrypt, bookmark, extrac…...

Realistic Vision V5.1 模型安全与内容过滤部署指南

Realistic Vision V5.1 模型安全与内容过滤部署指南 如果你正在公司里部署AI图像生成服务&#xff0c;最头疼的问题是什么&#xff1f;除了模型效果和生成速度&#xff0c;恐怕就是内容安全了。你肯定不希望员工或者用户用它生成一些不合规的图片&#xff0c;这不仅可能违反公…...

AutoGLM-Phone-9B开箱即用:跟着这篇,快速部署你的移动端大模型

AutoGLM-Phone-9B开箱即用&#xff1a;跟着这篇&#xff0c;快速部署你的移动端大模型 1. AutoGLM-Phone-9B简介 1.1 什么是AutoGLM-Phone-9B AutoGLM-Phone-9B是一款专为移动端优化的多模态大语言模型&#xff0c;它能够同时处理视觉、语音和文本三种输入方式。这个模型最大…...

格式排版改到崩溃?高校教授说用这几个AI论文写作工具

论文写作总让人头大&#xff1f;格式排版改到崩溃、文献检索效率低、逻辑结构不清晰……这些痛点你是不是也遇到过&#xff1f;其实&#xff0c;只要用对 AI 工具、走对流程&#xff0c;就能事半功倍。资深教授建议&#xff0c;从选题到降重&#xff0c;全程使用专业工具辅助&a…...

解密ARM多核调度:从Linux内核源码看SMP负载均衡如何玩转Cortex-A系列

ARM多核调度实战&#xff1a;从Linux内核视角剖析SMP负载均衡的艺术 在移动计算和嵌入式系统领域&#xff0c;ARM架构凭借其出色的能效比已经占据了主导地位。随着Cortex-A系列处理器核心数量的不断增加&#xff0c;如何高效地管理这些计算资源成为系统性能优化的关键。本文将带…...