设计模式(十三)抽象工厂模式
请直接看原文:
设计模式(十三)抽象工厂模式_抽象工厂模式告诉我们,要针对接口而不是实现进行设计。( )-CSDN博客
--------------------------------------------------------------------------------------------------------------------------------
前言
此前讲解过简单工厂模式和工厂模式,这一篇我们来学习工厂系列的最后一个模式抽象工厂模式,建议在阅读此文前,请先阅读设计模式(四)简单工厂模式、设计模式(十)工厂方法模式这两篇文章。
抽象工厂模式定义
抽象工厂模式可以说是是工厂方法模式的升级版,当需要创建的产品有多个产品线(产品族)时使用抽象工厂模式是比较好的选择。那什么是多个产品线呢?拿我们在设计模式(四)简单工厂模式、设计模式(十)工厂方法模式中学习的生产电脑的例子来举例,我们一直都是生产联想和惠普的电脑,但是电脑也有多个产品线:台式机、笔记本和平板等等,联想和惠普都在生产这些不同产品线上的电脑,使用工厂方法模式已经满足不了需求,这一篇文章我们就用抽象工厂模式来解决这一问题。
抽象工厂模式定义
为创建一组相关或者相互依赖的对象提供一个接口,而无需指定它们的具体类。
抽象工厂模式UML图
在抽象工厂模式中有如下角色:
- AbstractFactory:抽象工厂,它声明了用来创建不同产品的方法。
- ConcreteFactory:具体工厂,实现抽象工厂中定义的创建产品的方法。
- AbstractProduct:抽象产品,为每种产品声明业务方法。比如上图的AbstractProductA和 AbstractProductB。
- ConcreteProduct:具体产品,定义具体工厂生产的具体产品,并实现抽象产品中定义的业务方法。
抽象工厂模式简单实现
联想和惠普生产的电脑分为了两个产品线,一个台式机,一个是笔记本。为了解决增加产品线的问题,我们用抽象工厂模式来进行实现。
抽象产品
首先定义抽象产品类:
public abstract class DesktopComputer {public abstract void start();
}
public abstract class NotebookComputer {public abstract void start();
}
两个抽象产品类分别为DesktopComputer和NotebookComputer ,用来定义两个产品线:台式机和笔记本。它们都定义了start方法,用来启动电脑。
具体产品
具体产品为联想和惠普旗下的台式机和笔记本,如下所示。
public class LenovoDesktopComputer extends DesktopComputer {@Overridepublic void start() {System.out.println("联想台式电脑启动");}
}public class HpDesktopComputer extends DesktopComputer {@Overridepublic void start() {System.out.println("惠普台式电脑启动");}
}public class LenovoNotebookComputer extends NotebookComputer {@Overridepublic void start() {System.out.println("联想笔记本电脑启动");}
}
public class HpNotebookComputer extends NotebookComputer {@Overridepublic void start() {System.out.println("惠普笔记本电脑启动");}
}
抽象工厂
接着创建生产电脑的抽象工厂,如下所示,
public abstract class ComputerFactory {public abstract DesktopComputer createDesktopComputer();public abstract NotebookComputer createNotebookComputer();
}
定义了两个方法,分别用来生产台式电脑和笔记本电脑。
具体工厂
定义联想和惠普工厂:
public class LenovoFactory extends ComputerFactory {@Overridepublic DesktopComputer createDesktopComputer() {return new LenovoDesktopComputer();}@Overridepublic NotebookComputer createNotebookComputer() {return new LenovoNotebookComputer();}
}public class HpFactory extends ComputerFactory {@Overridepublic DesktopComputer createDesktopComputer() {return new HpDesktopComputer();}@Overridepublic NotebookComputer createNotebookComputer() {return new HpNotebookComputer();}
}
联想工厂和惠普工厂用来生产台式机和笔记本这两个不同产品线的电脑。
客户端调用
最后编写客户端:
public class Client {public static void main(String[]args) {ComputerFactory lenocoFactory=new LenovoFactory();lenocoFactory.createDesktopComputer().start();lenocoFactory.createNotebookComputer().start();ComputerFactory hpFactory=new HpFactory();hpFactory.createDesktopComputer().start();hpFactory.createNotebookComputer().start();}
}
分别用LenovoFactory和HpFactory生产台式和笔记本电脑,并调用start方法启动它们。
运行结果为:
联想台式电脑启动
联想笔记本电脑启动
惠普台式电脑启动
惠普笔记本电脑启动
接下来给出这个例子的UML图,更便于理解,如下所示。
抽象工厂模式的优缺点
优点
具体类的创建实例过程与客户端分离,客户端通过工厂的抽象接口操纵实例,客户端并不知道具体的实现是谁。
缺点
如果增加新的产品族则也需要修改抽象工厂和所有的具体工厂。
抽象工厂模式的使用场景
- 一个系统不依赖于产品线实例如何被创建、组合和表达的细节。
- 系统中有多于一个的产品线,而每次只使用其中某一产品线。
- 一个产品线(或是一组没有任何关系的对象)拥有相同的约束。
相关文章:
设计模式(十三)抽象工厂模式
请直接看原文:设计模式(十三)抽象工厂模式_抽象工厂模式告诉我们,要针对接口而不是实现进行设计。( )-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- …...
HTTP Cookie 你了解多少?
Cookie是什么? 先给大家举个例子,F12 打开浏览器的页面之后,我们能在 Response Headers 的字段里面看到一个header 叫做 Set-Cookie,如下所示 图中包含的 Set-Cookie 为 Set-Cookie:uuid_tt_dd10_20293537580-1709432565344-232…...
【QT+QGIS跨平台编译】之五十六:【QGIS_CORE跨平台编译】—【qgsmeshcalclexer.cpp生成】
文章目录 一、Flex二、生成来源三、构建过程一、Flex Flex (fast lexical analyser generator) 是 Lex 的另一个替代品。它经常和自由软件 Bison 语法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用 C 语言写成。 “flex 是一个生成扫描器的工具,能够识别文本中…...
ar时间序列
AR时间序列模型(AutoRegressive Time Series Model)是一种用于分析和预测时间序列数据的统计模型。该模型假设未来的观测值与过去的观测值相关,且该相关性可以通过线性回归来描述。 AR模型的基本思想是将当前时刻的观测值表示为过去几个时刻的…...
Android 14 AAOS audio
文章目录 乘客音频投放到主音频区动态路由配置controlhal实现的具体流程control hal AudioGain的callbackAudioModuleChange变化的通知 乘客音频投放到主音频区 场景: 是将乘客区的Media 属性的数据通过主屏区的设备进行播放。具体而言 在副屏user11播放的音乐是输出…...
文心一言 VS 讯飞星火 VS chatgpt (207)-- 算法导论15.4 4题
四、说明如何只使用表 c 中 2*min(m,n) 个表项及O(1)的额外空间来计算LCS的长度。然后说明如何只用 min(m,n) 个表项及O(1)的额外空间完成相同的工作。要写代码的时候,请用go语言。 文心一言: 在只使用 2 * min(m, n) 个表项和 …...
【论文笔记】Attention Is All You Need
【论文笔记】Attention Is All You Need 文章目录 【论文笔记】Attention Is All You NeedAbstract1 Introduction2 Background补充知识:软注意力 soft attention 和硬注意力 hard attention?补充知识:加法注意力机制和点乘注意力机制Extende…...
(亲测可用)Adobe Photoshop 2024下载与安装
背景介绍:Adobe Photoshop 2024 是全球最受欢迎的图像编辑软件之一,2024年的版本带来了一系列令人印象深刻的功能: AI增强的自动选择和蒙版工具:现在,用户可以更轻松地选择和处理复杂的图像元素。更多的3D渲染功能&…...
uniapp聊天记录本地存储(详细易懂)
目录 目录 1、通过websocket拿取数据 2、获取聊天数据 3、聊天信息存储 、更新 4、读取聊天记录 5、发送信息,信息获取 6、最终效果 1.聊天信息的存储格式 2、样式效果 写聊天项目,使用到了本地存储。需要把聊天信息保存在本地,实时获…...
Vue.js中的$nextTick
其实目前在我现有的开发经历中,我还没有实际运用过$nextTick,今天在看书时,学习到了这个东西,所以做个笔记记录一下。 一、$nextTick是什么? $nextTick 是 Vue提供的一个方法,用于在 DOM 更新之后执行回调…...
python+mysql咖啡店推荐系统django+vue
(1).研究的基本内容 系统的角色分为: 1.管理员 2.会员 3.非会员 角色不同,权限也不相同 技术栈 后端:python 前端:vue.jselementui 框架:django/flask Python版本:python3.7 数据库:mysql5.7…...
综合实验nginx+nfs+kpa
综合实验 实验目的: 静态资源和动态资源分别存放在远端存储NFS上,NFS上数据实现实时备份,用户通过负载访问后端的web服务。实现ngixn负载高可用,当keepalived master宕机,vip能自动跳转到备用节点 实验环境ÿ…...
springboot197基于springboot的毕业设计系统的开发
简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的毕业设计系统的开发 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 …...
group by报错
# 报错:[42000][1055] Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column base.biz_org_rep.ID which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_grou…...
3、云原生安全之falco的部署
文章目录 1、helm安装2、拉去镜像失败与解决3、安装faclo4、安装nfs服务器,配置k8s的持久卷4.1、创建nfs服务器,4.2、部署master节点(nsf服务的客户端)4.3、pv与pvc4.4、假设pv和pvc的配置文件出错了5、安装falcosidekick可视化(建议跳过,直接使用6)6、安装faclo与falco…...
Docker架构概述
Docker是基于Go语言实现的开源容器项目,能够把开发的应用程序自动部署到容器的开源的应用容器引擎。Docker的构想是要实现"Build, Ship and Run Any App, Anywhere",即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运…...
安装 node 错误的配置环境变量之后使用 npm 报错
安装 node 错误的配置环境变量之后使用 npm 报错 node:internal/modules/cjs/loader:1147 throw err; ^ Error: Cannot find module ‘F:\ACodeTools\Node\node_modules\npm\bin\node_modules\npm\bin\npm-cli.js’ at Module._resolveFilename (node:internal/modules/cjs/loa…...
Matlab 最小二乘插值(曲线拟合)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在多项式插值时,当数据点个数较多时,插值会导致多项式曲线阶数过高,带来不稳定因素。因此我们可以通过固定幂基函数的最高次数 m(m < n),来对我们要拟合的曲线进行降阶。之前的函数形式就可以变为: 二、实现…...
AWTK-MVVM 配置文件模型
配置文件模型 AWTK-MVVM 内置了一些配置文件模型,用于读写各种配置文件,比如,JSON/XML/INI/CSV/UBJSON 等。 文件名中可以引用下面的变量。 ${app_dir} 应用程序目录${user_dir} 用户目录${temp_dir} 临时目录 json(url${app_dir}/demos/de…...
【活动】金三银四,前端工程师如何把握求职黄金期
随着春意盎然的气息弥漫大地,程序员群体中也迎来了一年一度的“金三银四”求职热潮。这个时间段对于广大前端工程师而言,不仅象征着生机勃发的新起点,更是他们职业生涯中至关重要的转折点。众多知名公司在这一时期大规模开启招聘通道…...
CML估计器:基于条件矩约束与局部稳健性的因果推断新方法
1. 项目概述:从条件矩约束到局部稳健估计在实证研究的工具箱里,我们常常遇到一个核心难题:如何从一个充满内生性、遗漏变量和复杂交互的数据集中,干净地识别出我们关心的因果效应?传统的工具变量(IV&#x…...
别再乱装WinPcap了!手把手教你为华为eNSP Cloud正确配置虚拟网卡(Win7/Win10兼容方案)
华为eNSP Cloud虚拟网卡配置全指南:从原理到避坑实践 当你第一次打开华为eNSP Cloud功能时,是否也遇到过网卡显示不全的困扰?这个问题困扰过无数网络学习者和备考者,而90%的根源都指向同一个错误——WinPcap的安装方式。本文将彻底…...
puzzle(0312)找牛
目录 内固问题、最大内固问题 找牛 (10) (17) 内固问题、最大内固问题 参考内固、外固 寻找特定的内固集,即内固问题。 寻找最大内固数的内固集,即最大内固问题。 无向图的最大内固集(即…...
Translumo终极指南:3分钟掌握Windows实时屏幕翻译神器
Translumo终极指南:3分钟掌握Windows实时屏幕翻译神器 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 你是否在…...
硬件-软件协同设计:原理、优化与应用实践
1. 硬件-软件协同设计的本质与挑战现代科学仪器正变得越来越复杂,特别是在基础物理和相关领域。想象一下,你正在设计一台粒子探测器或天体物理观测站,这不仅仅是一堆硬件零件的简单组装,而是一个由传感器、电子设备、冷却系统、触…...
Claude医学文献分析准确率实测:对比GPT-4o、Gemini 2.0与专业文献数据库(n=1,847篇RCT,Kappa=0.91)
更多请点击: https://codechina.net 第一章:Claude医学文献分析案例 在临床研究与循证医学实践中,研究人员常需从海量PubMed、NEJM或Lancet等来源的PDF或HTML格式文献中快速提取关键信息。Claude系列大模型凭借其长上下文(最高20…...
MySQL 子查询优化:从慢查询到飞起的实战之路
开场白 说起 MySQL 子查询优化,这事儿我还真踩过大坑。有一次上线一个报表功能,SQL 里套了两层子查询,测试环境跑得挺快,上了生产直接把数据库干到 CPU 100%,整个系统卡了十分钟。后来 DBA 找过来,一看执行…...
5分钟搭建私有抖音无水印解析服务:DouYinBot高效视频下载指南
5分钟搭建私有抖音无水印解析服务:DouYinBot高效视频下载指南 【免费下载链接】DouYinBot 该项目仅自用,不提供抖音视频下载 项目地址: https://gitcode.com/gh_mirrors/do/DouYinBot 在短视频创作成为日常的今天,获取纯净无水印的抖音…...
JMeter并发与持续性压测:从按钮操作到系统心跳诊断
1. 这不是“点几下就出报告”的玩具,而是压测工程师的听诊器很多人第一次打开 JMeter,以为它就是个高级版的 Postman:填个 URL、点个“启动”,等几秒弹出个 Summary Report,看到平均响应时间 86ms 就松一口气ÿ…...
客户旅程重构实战:用AI Agent打通投保、核保、续期、理赔全链路(含可落地的RPA+LLM融合架构图)
更多请点击: https://codechina.net 第一章:客户旅程重构实战:用AI Agent打通投保、核保、续期、理赔全链路(含可落地的RPALLM融合架构图) 传统保险业务流程中,投保表单录入、核保规则校验、续期提醒触发与…...
