创建型模式

       抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。

        简单说,它就像一个 "超级工厂",可以生产一整套配套的产品,而不是单一产品。比如说GUI,在windows平台使用windows风格,mac使用mac风格。

为什么需要抽象工厂模式?

以电子设备工厂为例,我们可以清晰看到为什么需要抽象工厂模式:

  1. 产品族管理:每个品牌(苹果、华为)都有一套配套产品(手机、电脑、平板),抽象工厂确保这些产品能协同工作(如生态互联)
  2. 隔离具体实现:用户不需要知道 "iPhone 15" 的具体细节,只需知道 "这是苹果手机"
  3. 轻松切换品牌:从苹果全家桶换成华为全家桶时,只需更换工厂,无需修改使用产品的代码
  4. 符合开闭原则:新增小米工厂时,无需修改现有代码,只需实现新的工厂和产品

示例

        看代码是最好理解的方法。可以看到,这里是多个工厂,每个工厂对应多个不同的设备的。

#include <iostream>
#include <string>// 抽象产品:手机
class Phone {
public:virtual ~Phone() = default;virtual std::string getName() const = 0;
};// 抽象产品:电脑
class Computer {
public:virtual ~Computer() = default;virtual std::string getName() const = 0;
};// 抽象产品:平板
class Tablet {
public:virtual ~Tablet() = default;virtual std::string getName() const = 0;
};// 具体产品:苹果手机
class IPhone : public Phone {
public:std::string getName() const override {return "iPhone 15";}
};// 具体产品:苹果电脑
class Mac : public Computer {
public:std::string getName() const override {return "MacBook Pro";}
};// 具体产品:苹果平板
class IPad : public Tablet {
public:std::string getName() const override {return "iPad Pro";}
};// 具体产品:华为手机
class HuaweiPhone : public Phone {
public:std::string getName() const override {return "Huawei Mate 60";}
};// 具体产品:华为电脑
class HuaweiComputer : public Computer {
public:std::string getName() const override {return "Huawei MateBook X Pro";}
};// 具体产品:华为平板
class HuaweiTablet : public Tablet {
public:std::string getName() const override {return "Huawei MatePad Pro";}
};// 抽象工厂:电子设备工厂
class ElectronicFactory {
public:virtual ~ElectronicFactory() = default;virtual Phone* createPhone() const = 0;virtual Computer* createComputer() const = 0;virtual Tablet* createTablet() const = 0;
};// 具体工厂:苹果工厂
class AppleFactory : public ElectronicFactory {
public:Phone* createPhone() const override {return new IPhone();}Computer* createComputer() const override {return new Mac();}Tablet* createTablet() const override {return new IPad();}
};// 具体工厂:华为工厂
class HuaweiFactory : public ElectronicFactory {
public:Phone* createPhone() const override {return new HuaweiPhone();}Computer* createComputer() const override {return new HuaweiComputer();}Tablet* createTablet() const override {return new HuaweiTablet();}
};// 客户端代码:使用电子设备
void useElectronicDevices(const ElectronicFactory& factory) {Phone* phone = factory.createPhone();Computer* computer = factory.createComputer();Tablet* tablet = factory.createTablet();std::cout << "使用的电子设备:" << std::endl;std::cout << "- 手机:" << phone->getName() << std::endl;std::cout << "- 电脑:" << computer->getName() << std::endl;std::cout << "- 平板:" << tablet->getName() << std::endl;delete phone;delete computer;delete tablet;
}int main() {// 使用苹果设备std::cout << "=== 苹果生态 ===" << std::endl;AppleFactory appleFactory;useElectronicDevices(appleFactory);// 切换到华为设备,无需修改useElectronicDevices函数std::cout << "\n=== 华为生态 ===" << std::endl;HuaweiFactory huaweiFactory;useElectronicDevices(huaweiFactory);return 0;
}

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

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

相关文章

【大语言模型入门】—— Transformer 如何工作:Transformer 架构的详细探索

Transformer 如何工作&#xff1a;Transformer 架构的详细探索Transformer 如何工作&#xff1a;Transformer 架构的详细探索什么是 Transformer&#xff1f;什么是 Transformer 模型&#xff1f;历史背景从 RNN 模型&#xff08;如 LSTM&#xff09;到 Transformer 模型在 NLP…

iOS安全和逆向系列教程 第20篇:Objective-C运行时机制深度解析与Hook技术

iOS安全和逆向系列教程 第20篇:Objective-C运行时机制深度解析与Hook技术 引言 在上一篇文章中,我们深入学习了ARM64汇编语言的基础知识,掌握了从寄存器操作到指令分析的完整技能体系。现在,我们将把这些底层知识与iOS应用的高层逻辑联系起来,深入探讨Objective-C运行时…

IDEA中全局搜索快捷键Ctrl+Shift+F为何失灵?探寻原因与修复指南

在软件开发中&#xff0c;高效地查找和管理代码是提升生产力的关键。IntelliJ IDEA&#xff0c;作为一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了丰富的搜索功能&#xff0c;帮助开发者迅速定位代码、资源、甚至是IDE功能本身。 在 IntelliJ IDE…

【学习笔记】Lean4 定理证明 ing

文章目录概述Lean4 定理证明初探示例&#xff1a;证明 1 1 2示例&#xff1a;证明 2 * (x y) 2 * x 2 * yLean4 定理证明基础命题与定理命题&#xff08;Proposition&#xff09;定理&#xff08;Theorem&#xff09;量词策略概述 Lean证明是指在Lean环境中&#xff0c;通…

墨者:SQL注入漏洞测试(HTTP头注入)

墨者学院&#xff1a;SQL注入漏洞测试(HTTP头注入)&#x1f680; 1. 什么是HTTP头注入&#xff1f;&#x1f50d; HTTP头注入是指攻击者通过篡改HTTP请求头部的字段&#xff08;如User-Agent、Referer、Cookie、Host等&#xff09;&#xff0c;将恶意SQL代码插入到后端数据库查…

linux_前台,后台进程

*在用户访问端口时&#xff0c;操作系统会形成对应的session,在其的内部进一步形成bash等进程 *一个会话只有一个前台进程&#xff0c;可以有多个后台进程&#xff0c;前台与后台进程的区别在于谁拥有键盘的使用权*前台与后台进程都可以访问显示器但是后台无法访问标准输入获取…

spring data mongodb 入门使用手册

<!--pom.xml引入依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>文档映射类Student.java import lombok.Data; import lombok.NoArgsCons…

Fastjson2常用操作大全:对象、字符串、集合、数组、Map与JSON互转实战

高性能&#xff1a; 核心解析器和生成器经过深度优化&#xff0c;性能远超许多同类库。 功能丰富&#xff1a; 支持标准JSON、JSONPath查询、泛型处理、日期格式化、自定义序列化/反序列化等。 易用性&#xff1a; API 设计简洁直观&#xff0c;JSON 工具类提供了最常用的 toJS…

大模型——字节Coze重磅开源!Dify何去何从

大模型——字节Coze重磅开源!Dify何去何从 想必很多人盼了很久,就在昨晚,字节Coze终于开源了!Coze Studio 是字节跳动新一代 AI Agent 开发平台扣子(Coze)的开源版本。 提供 AI Agent 开发所需的全部核心技术:Prompt、RAG、Plugin、Workflow,使得开发者可以聚焦创造 A…

NaVid——基于单目RGB捕获的视频让VLM规划「连续环境中VLN」的下一步:无需地图/里程计/深度信息(含MP3D/R2R/RxR,及VLN-CE的详解)

前言 因为我司「七月在线」准备于25年7月底复现下NaVILA&#xff0c;而在研究NaVILA的过程中&#xff0c;注意到了这个NaVid 虽然NaVid目前已经不是VLN sota了&#xff0c;但其首次展示了VLM在无需地图、里程计或深度输入的情况下&#xff0c;能够实现优秀的导航性能且对后来…

【Vue2】结合chrome与element-ui的网页端条码打印

所有文章都是免费查看的&#xff0c;如果有无法查看的情况&#xff0c;烦请联系我修改哈~ 序言 为什么要做这个呢&#xff1f;因为所需要的条码打印功能比较简单&#xff0c;符合需要即可&#xff0c;但是呢网上查看了发现并没有合适的开源项&#xff0c;其他成熟的软件收费又超…

循环神经网络——动手学深度学习7

环境&#xff1a;PyCharm python3.8 &#x1f449;【循环神经网络】(recurrent neural network&#xff0c;RNN) RNN通过 引入状态变量存储过去的信息和当前的输入&#xff0c;从而可以确定当前的输出。状态变量捕捉序列的时序依赖&#xff0c;是处理文本、时间序列等数据的…

Java面试宝典:MySQL8新特性底层原理

一、降序索引的革新 1.1 降序索引的核心概念 MySQL 8.0 实现了真正的降序索引(Descending Index) 支持,这是数据库引擎层面的重大改进: 存储引擎支持:仅 InnoDB 存储引擎支持降序索引,且仅适用于 B+Tree 索引结构 语法显式声明:通过 DESC 关键字显式指定字段的排序方向…

前端-html+CSS基础到高级(三)html基础和开发工具

一、html语法规范什么是注释?在同学上课学习时&#xff0c;我们会在书本段落间记录内容的注解&#xff0c;方便下次看到此处理解。问题&#xff1a;我们在书本段落间记录下的注解是为了给谁看的&#xff1f; 下次的阅读课本者&#xff08;自己&#xff09;。程序员在写代码时也…

-Dspring.output.ansi.enabled=ALWAYS 设置彩色日志不生效

-Dspring.output.ansi.enabledALWAYS 设置彩色日志不生效 问题原因&#xff1a;使用的自定义的 logback-spring.xml日志需要改一下 <?xml version"1.0" encoding"UTF-8"?> <configuration><appender name"STDOUT" class"c…

C# 判断语句深度解析

C# 判断语句深度解析 引言 在编程领域,C# 是一种广泛使用的面向对象的编程语言,常用于构建各种应用程序,从桌面到移动应用,再到网站服务。C# 的核心特性之一是其强大的控制流机制,其中包括条件判断。本文将深入探讨 C# 中的判断语句,包括它们的类型、使用场景以及最佳实…

Ambari 3.0.0 全网首发支持 Ubuntu 22!

本月我们团队带来了一个重磅进展&#xff1a;Ambari 3.0.0 全网首发支持 Ubuntu 22&#xff01; 经过数月筹备和持续迭代&#xff0c;终于让 Ambari 以及大数据基础组件可以顺利运行在 Ubuntu 22 上。 需求来源&#xff1a;用户呼声决定研发方向 年初有位小伙伴私信我们&#x…

Android Camera capture

序 想了下还是挤挤时间&#xff0c;把相机这基础流程写完吧&#xff0c;前面每篇写的都还是挺耗时的&#xff08;就是累了&#xff0c;想偷偷懒&#xff0c;哈哈哈哈&#xff09;&#xff0c;那接着前面的几篇文章&#xff0c;给这一些列写上一个中规中矩的结局吧~ APP层 以下是…

落霞归雁思维框架应用(十) ——在职考研 199 管综 + 英语二 30 周「顺水行舟」上岸指南

落霞归雁思维框架应用&#xff08;十&#xff09; ——在职考研 199 管综 英语二 30 周「顺水行舟」上岸指南 CSDN 首发 | 作者&#xff1a;落霞归雁 | 2025-08-01 开场&#xff1a;把 199英二 从“两座大山”变成“两条顺流” 在职党最怕两句话&#xff1a; “管综题量太大…

自动调优 vLLM 服务器参数(实战指南)

1. 操作步骤 该脚本能够自动搜索最优的vLLM服务器参数组合&#xff08;包括max-num-seqs和max-num-batched-tokens&#xff09;&#xff0c;在满足端到端延迟和前缀缓存命中率等要求的同时&#xff0c;实现吞吐量最大化。 1.1 前提条件 克隆 vLLM 并切到目标分支git clone http…