目的

在 工厂模式 中,当需要创建新的产品时,则额外需要创建新的工厂,这种模式是对产品制造方法的抽象化,如果产品种类变多,则工厂数目变多,则代码规模会越来越大,且不同的产品类的生成依赖不同的工厂。为了解决上述问题,则提出了新的模式-抽象工厂模式。抽象工厂模式是对工厂的抽象化,即假设工厂不会只局限于生产一类产品,而是生产多系列产品。以汽车工厂为例,可能有多个品牌的汽车厂,每个汽车厂都可以/可能生产多种产品,如跑车、越野车等系列产品,那我们就有了下面的表格:

轿车越野车卡车
A品牌车厂A1A2A3
B品牌车厂B1B2B3

A品牌车厂、B品牌车厂就类似一个个具体的生产工厂,轿车、越野车、卡车就是一系列的具体产品,抽象工厂不仅对产品进行抽象(统一接口),同时对工厂也进行抽象(统一接口,接口用来生产具体的系列产品)。

抽象工厂模式适用于如下场景:

  • 需要与多个不同系列的相关产品交互, 出于对未来扩展性的考虑, 不希望代码基于产品的具体类进行构建, 在这种情况下, 可以使用抽象工厂;抽象工厂提供了一个(或一套)接口, 可用于创建每个系列产品的对象。 只要代码通过该接口创建对象,就不会生成与应用程序已生成的产品类型不一致的产品;

实现

  1. 产品类型(可能有多个,列)与产品体系/产品变体(产品类型数目一致,但产品类型实现方式不同,行)为维度绘制矩阵。

  2. 声明抽象产品接口(不同的产品类型的共同接口),让所有具体产品类实现这些接口。

  3. 声明抽象工厂接口(不同产品体系/产品变体的共同接口), 并在接口中为所有抽象产品提供一组构建方法。

  4. 为每种产品体系/产品变体实现一个具体工厂类。

  5. 修改应用程序的初始化代码,代码中根据应用程序配置或当前环境, 对特定具体工厂类进行初始化,并将该工厂对象传递给所有需要创建产品的类。

  6. 找出代码中所有对产品构造函数的直接调用, 将其替换为对工厂对象中相应构建方法的调用。

具体代码实现如下,这里以抽象工厂模式的应用场景UI为例:

#include <iostream>
#include <memory>class Button {
public:virtual void render() = 0;virtual ~Button() = default;
};class Checkbox {
public:virtual void render() = 0;virtual ~Checkbox() = default;
};class WindowsButton : public Button {
public:void render() override {std::cout << "Rendering Windows Button\n";}
};class WindowsCheckbox : public Checkbox {
public:void render() override {std::cout << "Rendering Windows Checkbox\n";}
};class MacButton : public Button {
public:void render() override {std::cout << "Rendering Mac Button\n";}
};class MacCheckbox : public Checkbox {
public:void render() override {std::cout << "Rendering Mac Checkbox\n";}
};class GUIFactory {
public:virtual std::unique_ptr<Button> createButton() = 0;virtual std::unique_ptr<Checkbox> createCheckbox() = 0;virtual ~GUIFactory() = default;
};class WindowsFactory : public GUIFactory {
public:std::unique_ptr<Button> createButton() override {return std::make_unique<WindowsButton>();}std::unique_ptr<Checkbox> createCheckbox() override {return std::make_unique<WindowsCheckbox>();}
};class MacFactory : public GUIFactory {
public:std::unique_ptr<Button> createButton() override {return std::make_unique<MacButton>();}std::unique_ptr<Checkbox> createCheckbox() override {return std::make_unique<MacCheckbox>();}
};void renderUI(GUIFactory& factory) {auto button = factory.createButton();auto checkbox = factory.createCheckbox();button->render();checkbox->render();
}int main() {WindowsFactory winFactory;MacFactory macFactory;std::cout << "Using Windows Factory:\n";renderUI(winFactory);std::cout << "\nUsing Mac Factory:\n";renderUI(macFactory);return 0;
}

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

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

相关文章

Vue3响应式编程核心:ref与reactive全方位对比

在Vue3的Composition API中&#xff0c;ref和reactive是构建响应式数据的核心工具。许多开发者对它们的选择存在困惑&#xff1a;何时用ref的.value&#xff1f;何时用reactive的直接访问&#xff1f;为何解构会丢失响应性&#xff1f;本文从原理、场景到实战陷阱&#xff0c;为…

Redis实战-缓存的解决方案(一)

1.什么是缓存缓存就是数据交换的缓存区&#xff0c;是存储数据的临时区域&#xff0c;读写性能高。浏览器会有缓存&#xff0c;tomcat服务器也会有缓存&#xff0c;数据库也会有缓存&#xff0c;CPU也会有缓存&#xff0c;磁盘也会有缓存&#xff0c;所以说缓存是无处不在的并且…

CI/CD企业案例详解

7.持续集成持续交付企业示例 为了让容器构建镜像可以持续集成并自动上传到harbor仓库&#xff0c;业务主机通过持续交付自动从仓库中下载镜像最近版本并实现业务更新7.1 在jenkins中添加registry节点 7.1.1 在业务节点中安装docker和java环境并配置其可以从仓库中下载镜像 # 新…

C++ 入门核心知识

一、C 课程概述与发展历史1. 发展历程&#xff1a;从 C 语言扩展到标准化C 的起源可追溯至 1979 年&#xff0c;由贝尔实验室的 Bjarne Stroustrup 主导开发。当时他为解决大型项目开发中 C 语言在可维护性和扩展性上的不足&#xff0c;在 C 语言基础上引入了面向对象编程特性。…

labelme数据标注保姆级教程:从安装到格式转换全流程,附常见问题避坑指南(含视频讲解)

引言&#xff1a;为什么选择labelme&#xff1f; 在人工智能和机器学习领域&#xff0c;高质量的标注数据是训练优秀模型的基础。而 labelme作为一款开源、跨平台的图像标注工具&#xff0c;凭借其强大的功能和易用性&#xff0c;成为了数据标注领域的热门选择。 它支持多种标…

人工智能-python-深度学习-自动微分

自动微分&#xff1a;基础概念与应用 自动微分&#xff08;Autograd&#xff09;是现代深度学习框架&#xff08;如PyTorch、TensorFlow&#xff09;中的一个核心功能。它通过构建计算图并在计算图上自动计算梯度&#xff0c;简化了反向传播算法的实现。以下是自动微分的基本概…

k8s原理及操作

简介 kubernetes的本质是一组服务器集群&#xff0c;它可以在集群的每个节点上运行特定的程序&#xff0c;来对节点中的容器 进行管理。目的是实现资源管理的自动化&#xff0c;主要提供了如下的主要功能&#xff1a; 自我修复&#xff1a;一旦某一个容器崩溃&#xff0c;能够在…

理解音频响度:LUFS 标准及其计算实现

LUFS 及其重要性 1.1、什么是 LUFS&#xff1f; LUFS&#xff08;Loudness Units relative to Full Scale&#xff09;是音频工程中用于测量感知响度的标准单位。它已成为广播、流媒体和音乐制作领域的行业标准&#xff0c;用于确保不同音频内容具有一致的响度水平。 LUFS 是 I…

【在ubuntu下使用vscode打开c++的make项目及编译调试】

在ubuntu下使用vscode打开c的make项目及编译调试第一步&#xff1a;安装必要的软件第二步&#xff1a;示例项目准备1. 创建C源文件&#xff1a; main.cpp2. 创建头文件&#xff1a; utils.h3. 创建实现文件&#xff1a; utils.cpp第三步&#xff1a;使用 VS Code 打开项目第四步…

3-2.Python 函数 - None(None 概述、None 应用场景)

一、None 概述在 Python 中&#xff0c;None 是一个特殊的常量&#xff0c;用于表示空值或无值None 是 Python 中唯一的一个 NoneType 类型的实例二、None 应用场景 1、定义变量 None 常用于初始化变量&#xff0c;表示该变量暂时不需要有具体值 name Noneprint(name) print(t…

js获取html元素并设置高度为100vh-键盘高度

获取HTML元素并设置高度为(100vh - 键盘高度) 我将设计一个页面&#xff0c;展示如何获取HTML元素并动态设置其高度为视口高度减去键盘高度&#xff0c;这在移动设备上特别有用&#xff0c;可以避免键盘遮挡内容。 设计思路 创建一个带有输入框的界面&#xff0c;模拟键盘弹…

基于SpringBoot的校园博客管理系统

&#x1f517; 目录 一. 前言   二. 前端框架、后端框架以及存储框架使用情况说明   三. 核心技术     1. ✅Java开发语言     2. ✅MyBatis     3. ✅Mysql     4. ✅Vue     5. ✅部署项目   四. 演示效果     1. 管理员功能模块       …

Nginx + Certbot配置 HTTPS / SSL 证书

前提条件&#xff1a; 1.已有域名 2.Nginx 已安装并正在运行&#xff0c;且有对应的 Server 配置 3.防火墙开放 80 和 443 端口 安装 EPEL 仓库&#xff1a; sudo yum install epel-release -y安装 Snapd sudo yum install snapd -y启用并启动 Snapd Socket sudo systemctl ena…

图结构使用 Louvain 社区检测算法进行分组

图结构使用 Louvain 社区检测算法进行分组 flyfish Louvain 算法是一种基于模块度最大化的社区检测算法&#xff0c;核心目标是在复杂网络中找到“内部连接紧密、外部连接稀疏”的社区结构。它的优势在于高效性&#xff08;可处理百万级节点的大规模网络&#xff09;和近似最优…

layui.formSelects自定义多选组件在layer.open中使用、获取、复现

layui.formSelects自定义多选组件在layer.open中使用、获取、复现 引入css和js //<th:block th:include"include :: layui-formSelects-css"/> <link th:href"{/ajax/libs/layui-formSelects/formSelects-v4.css}" rel"stylesheet"/>…

基于SpringBoot的社团管理系统【2026最新】

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

运行node18报错

又碰到一个奇葩的问题&#xff0c;报错如下> tigermes.vue30.1.0 serve > vue-cli-service serveBrowserslist: caniuse-lite is outdated. Please run:npx update-browserslist-dblatestWhy you should do it regularly: https://github.com/browserslist/update-db#rea…

Python第三方库IPFS-API使用详解:构建去中心化应用的完整指南

目录 Python第三方库IPFS-API使用详解&#xff1a;构建去中心化应用的完整指南 引言&#xff1a;IPFS与去中心化存储的革命 星际文件系统&#xff08;IPFS&#xff0c;InterPlanetary File System&#xff09;是一种革命性的点对点超媒体协议&#xff0c;旨在创建持久且分布式的…

ETL与iPaaS的融合方案:加速数据集成流程

在今天的商业世界里&#xff0c;数据几乎无处不在。企业每天都在产生和接收海量的数据——从CRM到ERP&#xff0c;从云端SaaS应用到本地数据库&#xff0c;来源越来越分散&#xff0c;集成也越来越复杂。 传统的ETL工具&#xff08;提取、转换、加载&#xff09;在处理结构化数…

详解flink SQL基础(四)

文章目录1.Flink SQL介绍2.streaming SQL&watermarks使用3.窗口聚合&#xff08;window aggregations&#xff09;4.over aggregations5.FlinkSQL 流连接&#xff08;Streaming join&#xff09;6.使用MATCH_RECOGNIZE 进行模式识别和复杂事件处理7.变更记录&#xff08;ch…