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

工厂模式之抽象工厂模式(常用)

抽象工厂模式

工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。

同种类称为同等级,也就是说:工厂方法模式中只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。

然而抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,图 1 所示的是海尔工厂和 TCL 工厂所生产的电视机与空调对应的关系图。

电器工厂的产品等级与产品族
图1 电器工厂的产品等级与产品族

抽象工厂模式的定义与特点

抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

使用抽象工厂模式一般要满足以下条件:

  • 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
  • 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
  • 抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。

缺点:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。

抽象工厂模式的结构

抽象工厂模式的主要角色如下。

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。

  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。

  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。

  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

抽象工厂模式的主要角色如下。

抽象工厂模式的结构图
图2 抽象工厂模式的结构图

抽象工厂模式的适用场景

1. 当需要将请求的发送者和接收者解耦时,可以考虑使用抽象模式。
2. 当存在多个对象可以处理同一个请求时,可以考虑使用抽象模式。
3. 当需要动态地指定可以处理请求的对象时,可以考虑使用抽象模式。

简单的代码实现

// 抽象产品接口:操作系统
interface OperatingSystem {void run();
}// 具体产品:Windows操作系统
class WindowsOS implements OperatingSystem {@Overridepublic void run() {System.out.println("Running Windows OS");}
}// 具体产品:Linux操作系统
class LinuxOS implements OperatingSystem {@Overridepublic void run() {System.out.println("Running Linux OS");}
}// 抽象产品接口:应用程序
interface Application {void open();
}// 具体产品:Word应用程序
class WordApplication implements Application {@Overridepublic void open() {System.out.println("Opening Word Application");}
}// 具体产品:Excel应用程序
class ExcelApplication implements Application {@Overridepublic void open() {System.out.println("Opening Excel Application");}
}// 抽象工厂接口
interface SoftwareFactory {OperatingSystem createOperatingSystem();Application createApplication();
}// 具体工厂:Windows工厂
class WindowsFactory implements SoftwareFactory {@Overridepublic OperatingSystem createOperatingSystem() {return new WindowsOS();}@Overridepublic Application createApplication() {return new ExcelApplication();}
}// 具体工厂:Linux工厂
class LinuxFactory implements SoftwareFactory {@Overridepublic OperatingSystem createOperatingSystem() {return new LinuxOS();}@Overridepublic Application createApplication() {return new WordApplication();}
}// 抽象工厂模式通过SoftwareFactory接口和其实现类来创建不同类型的操作系统和应用程序。
// 客户端代码可以根据需要选择不同的工厂实例来创建不同的产品组合。
public class Client {public static void main(String[] args) {SoftwareFactory windowsFactory = new WindowsFactory();OperatingSystem windowsOS = windowsFactory.createOperatingSystem();Application windowsApp = windowsFactory.createApplication();windowsOS.run();windowsApp.open();SoftwareFactory linuxFactory = new LinuxFactory();OperatingSystem linuxOS = linuxFactory.createOperatingSystem();Application linuxApp = linuxFactory.createApplication();linuxOS.run();linuxApp.open();}
}

相关文章:

工厂模式之抽象工厂模式(常用)

抽象工厂模式 工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。 同种类称为同等级,也就是说:工厂方法模式中只考虑生产同等级的产品,但是在现实生…...

Apache服务Rwrite功能使用

Rewrite也称为规则重写,主要功能是实现浏览器访问时,URL的跳转。其正则表达式是基于Perl语言。要使用rewrite功能,Apache服务器需要添加rewrite模块。如果使用源码编译安装,–enable-rewrite。有了rewrite模块后,需要在…...

【一起来学kubernetes】6、kubernetes基本概念区分

前言 前一篇文章我们对k8s中的一些常见概念进行了一个梳理,接下来我们将常见一些概念的区别和联系进行一个理解 service和deployment的区别和联系 在Kubernetes中,Service和Deployment是两个不同的概念,它们之间存在一定的关联。 Deployme…...

Python基础入门例程66-NP66 增加元组的长度(元组)

最近的博文: Python基础入门例程65-NP65 名单中出现过的人(元组)-CSDN博客 Python基础入门例程64-NP64 输出前三同学的成绩(元组)-CSDN博客 Python基础入门例程63-NP63 修改报名名单(元组)-CSDN博客 目录 最近的博文: 描述...

ubuntu22.04 安装 jupyterlab

JupyterLab Install JupyterLab with pip: pip install jupyterlabNote: If you install JupyterLab with conda or mamba, we recommend using the conda-forge channel. Once installed, launch JupyterLab with: jupyter lab...

探索移动端可能性:Capacitor5.5.1和vue2在Android studio中精细融合

介绍: 移动应用开发是日益复杂的任务,本文将带领您深入探索如何无缝集成Capacitor5.5.1、Vue2和Android Studio,以加速您的开发流程Capacitor 是一个用于构建跨平台移动应用程序的开源框架。Vue 是一个流行的 JavaScript 框架,用…...

【深度学习】Python快捷调用InsightFace人脸检测,纯ONNX推理

pypi资料: https://pypi.org/project/insightface/ 模型选择: https://github.com/deepinsight/insightface/tree/master/python-package#model-zoo onnxruntime的GPU对应CUDA : https://onnxruntime.ai/docs/reference/compatibility …...

JAVA序列化和反序列化

JAVA序列化和反序列化 文章目录 JAVA序列化和反序列化序列化什么是序列化?为什么要进行序列化?如何将对线进行序列化具体实现过程 完整代码 序列化 什么是序列化? 就是将对象转化为字节的过程 为什么要进行序列化? 让数据更高效的传输让数据更好的…...

基于浣熊算法优化概率神经网络PNN的分类预测 - 附代码

基于浣熊算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于浣熊算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于浣熊优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…...

uni-app打包后,打开软件时使其横屏显示

找到page.json文件,在global加入以下代码: 这样就可以横屏显示了。...

MYSQL基础知识之【创建,删除,选择数据库】

文章目录 前言MySQL 创建数据库使用 mysqladmin 创建数据库使用 PHP脚本 创建数据库 MySQL 删除数据库使用 mysqladmin 删除数据库使用PHP脚本删除数据库 MySQL 选择数据库从命令提示窗口中选择MySQL数据库使用PHP脚本选择MySQL数据库 后言 前言 hello world欢迎来到前端的新世…...

关于 token 和证书

关于 token 和证书 在网络检测中,Token通常是指一种特殊的令牌,用于在分布式系统中进行资源控制和访问管理。Token可以用于验证客户端的身份、限制客户端的访问权限以及控制客户端对某些资源的使用。 在网络检测中,Token通常用于以下几个方…...

基于SSM和微信小程序的场地预约网站

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM和微信小程序的场地预约网站,jav…...

Javascript每天一道算法题(十七)——缺失的第一个正整数_困难

文章目录 前言1、问题2、示例3、解决方法(1)方法1 总结 前言 提示: 1、问题 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 看了很久…...

【React】路径别名配置

路径解析配置(webpack),把 / 解析为 src/路径联想配置(VsCode),VSCode 在输入 / 时,自动联想出来对应的 src/下的子级目录 1. 路径解析配置 安装craco npm i -D craco/craco项目根目录下创建配…...

前缀和——238. 除自身以外数组的乘积

文章目录 🍷1. 题目🍸2. 算法原理🍥解法一:暴力求解🍥解法二:前缀和(积) 🍹3. 代码实现 🍷1. 题目 题目链接:238. 除自身以外数组的乘积 - 力扣&a…...

MySql数据库常用指令(二)

MySql数据库常用指令(二) 一、WHERE 子句二、UPDATE 更新三、DELETE 语句四、LIKE 子句五、UNION 操作符 注:文中TEST为测试所用数据库,根据实际应用修改 一、WHERE 子句 SELECT 语句使用 WHERE 子句从数据表中读取数据&#xf…...

zookeeper 单机伪集群搭建简单记录

1、官方下载加压后,根目录下新建data和log目录,然后分别拷贝两份,分别放到D盘,E盘,F盘 2、data目录下面新建myid文件,文件内容分别为1,2,3.注意文件没有后缀,不能是txt文…...

【Linux】匿名管道与命名管道,进程池的简易实现

文章目录 前言一、匿名管道1.管道原理2.管道的四种情况3.管道的特点 二、命名管道1. 特点2.创建命名管道1.在命令行上2.在程序中 3.一个程序执行打开管道并不会真正打卡 三、进程池简易实现1.makefile2.Task.hpp3.ProcessPool.cpp 前言 一、匿名管道 #include <unistd.h&g…...

HTML5+ API 爬坑记录

背景: 有个比较早些使用5开发的项目, 最近两天反馈了一些问题, 解决过程在此记录; 坑1: plus.gallery.pick 选择图片没有进入回调 HTML5 API Reference 在 联想小新 平板电脑上选择相册图片进行上传时, 打开相册瞬间 应用会自动重启, 相册倒是有打开, 不过应用重启了, 导…...

JSONEditor-React:深度解析React生态中的JSON编辑器实现方案

JSONEditor-React&#xff1a;深度解析React生态中的JSON编辑器实现方案 【免费下载链接】jsoneditor-react react wrapper implementation for https://github.com/josdejong/jsoneditor 项目地址: https://gitcode.com/gh_mirrors/js/jsoneditor-react 在复杂的前端应…...

动态上下文发现:Cursor的最新思路,重新定义AI上下文管理

核心结论&#xff1a;当所有人都在比拼谁的上下文窗口更大时&#xff0c;Cursor团队反其道而行之&#xff0c;提出了动态上下文发现&#xff08;Dynamic Context Discovery&#xff09; 范式。它彻底摒弃了"把所有东西都塞进提示词"的传统做法&#xff0c;让AI智能体…...

Hypnos-i1-8B惊艳案例:用自然语言描述→自动生成LaTeX+Python可执行代码

Hypnos-i1-8B惊艳案例&#xff1a;用自然语言描述→自动生成LaTeXPython可执行代码 1. 模型能力概览 Hypnos-i1-8B是一款基于量子噪声注入训练的8B参数开源大模型&#xff0c;专为复杂逻辑推理和数学问题求解而设计。它能够理解自然语言描述&#xff0c;并直接生成可执行的La…...

Java 扩展函数式接口详解:BiFunction、BinaryOperator 与原生接口实战

一、前言 在实际开发中,我们总会遇到一些特殊场景:比如需要接收两个参数、需要对同一类型数据进行运算、需要避免装箱拆箱开销……这时候,四大核心接口就不够用了。 本篇文章将会讲四大核心接口的升级版—— 常用扩展函数式接口。这些接口都是基于四大核心接口延伸而来,完…...

Amazon速卖通双平台卖家必看:在线图片翻译工具帮你批量搞定多语言商品上架

【一、同时做Amazon和速卖通&#xff0c;商品图翻译的麻烦翻了一倍】 很多跨境电商卖家同时经营Amazon和速卖通两个平台。两个平台的买家群体不同、市场定位不同&#xff0c;但有一个共同点&#xff1a;商品图上的文字需要翻译成目标语言&#xff0c;否则海外买家看不懂。 问题…...

软考高级系统架构设计师备考(十三):计算机网络—常见协议与TCP/IP协议族

软考高级系统架构设计师备考(十三):计算机网络—常见协议与TCP/IP协议族 在计算机网络中,协议(Protocol是实现通信的规则与标准。上一节我们已经学习了网络体系结构(分层模型),而本节将进一步深入: 每一层到底使用了哪些协议? 这些协议是如何协同工作的?在软考高级…...

别再手动拉镜像了!用这个脚本5分钟搞定K8s 1.18.6集群的国内镜像源问题

5分钟极速部署Kubernetes 1.18.6集群&#xff1a;智能镜像加速方案全解析 当你在国内环境尝试搭建Kubernetes集群时&#xff0c;是否经常被各种镜像拉取失败的问题困扰&#xff1f;传统的手动拉取镜像方式不仅耗时耗力&#xff0c;还容易出错。本文将为你揭秘一种高效解决方案—…...

SAP采购订单收货后,数据到底进了EKBE还是MSEG?一张图帮你理清核心逻辑

SAP采购订单收货后的数据流向解析&#xff1a;EKBE与MSEG表的本质区别 刚接触SAP物料管理的朋友&#xff0c;第一次看到采购订单收货后生成的凭证数据&#xff0c;往往会陷入困惑——这些数据到底进了EKBE还是MSEG&#xff1f;这两个表看起来都记录了采购相关的信息&#xff0c…...

3分钟快速掌握Discord隐藏频道查看技巧:ShowHiddenChannels插件终极指南

3分钟快速掌握Discord隐藏频道查看技巧&#xff1a;ShowHiddenChannels插件终极指南 【免费下载链接】return-ShowHiddenChannels A BetterDiscord plugin which displays all hidden channels and allows users to view information about them. 项目地址: https://gitcode.…...

避坑指南:YOLOv3模型量化时,你的样本图片真的准备对了吗?

YOLOv3模型量化实战&#xff1a;样本图片准备的黄金法则与避坑指南 当你完成YOLOv3模型训练&#xff0c;满怀期待地将其部署到边缘设备时&#xff0c;却发现检测精度大幅下降——这种挫败感我深有体会。问题的根源往往不在模型结构或训练过程&#xff0c;而是被大多数人忽视的量…...