设计模式:抽象工厂模式(讲故事易懂)
抽象工厂模式
定义:将有关联关系的系列产品放到一个工厂里,通过该工厂生产一系列产品。
设计模式有三大分类:创建型模式、结构型模式、行为型模式
抽象工厂模式属于创建型模式

上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定的产品,这样会有工厂类太多的问题,不容易维护。现实生活中,小米工厂除了生产手机还可能生产有关联的平板电脑,即一个工厂会生产多个有关联关系的系列产品,这种方式即抽象工厂模式。
比如:
小米工厂生产 小米手机和小米平板电脑
华为工厂生产 华为手机和华为平板电脑
故事:铁蛋所在的富士康公司接到了为小米和华为代工手机和平板的任务,这个重任交给了打工人铁蛋,铁蛋是超级厉害的,铁蛋使用了抽象工厂模式解决了该问题。
铁蛋是怎么做的呢?他是这样做的:
一、定义手机相关的类(手机基类Phone、XiaomiPhone、HuaweiPhone)
二、定义平板相关的类(平板基类Computer 、XiaomiComputer 、HuaweiComputer)
三、定义工厂相关的类(工厂基类AbstractFactory、XiaomiFactory、HuaweiFactory)
如下:
#include <iostream>
#include <string>
using namespace std;// 手机基类
class Phone {
public:Phone(string name) : name_(name) {}virtual void InstallPhoSystemOperation() = 0;protected:string name_;
};
// 小米手机类
class XiaomiPhone : public Phone {
public:XiaomiPhone(string name) : Phone(name){cout << "获得一部小米手机: " << name << endl;}void InstallPhoSystemOperation() {cout << "为小米手机安装系统" << endl;}
};
// 华为手机类
class HuaweiPhone : public Phone {
public:HuaweiPhone(string name) : Phone(name){cout << "获得一部华为手机: " << name << endl;}void InstallPhoSystemOperation() {cout << "为华为手机安装系统" << endl;}
};// 平板基类
class Computer {
public:Computer(string name) : name_(name) {}virtual void InstallComSystemOperation() = 0;protected:string name_;
};
// 小米平板类
class XiaomiComputer : public Computer {
public:XiaomiComputer(string name) : Computer(name){cout << "获得一个小米平板: " << name << endl;}void InstallComSystemOperation() {cout << "为小米《平板》安装系统" << endl;}
};
// 华为平板类
class HuaweiComputer : public Computer {
public:HuaweiComputer(string name) : Computer(name){cout << "获得一个华为平板: " << name << endl;}void InstallComSystemOperation() {cout << "为华为《平板》安装系统" << endl;}
};// 抽象工厂接口
class AbstractFactory {
public:virtual Phone* CreatePhone(string name) = 0;virtual Computer* CreateComputer(string name) = 0;
};
// 小米工厂
class XiaomiFactory : public AbstractFactory {
public:Phone* CreatePhone(string name){return new XiaomiPhone(name);}Computer* CreateComputer(string name){return new XiaomiComputer(name);}
};
// 华为工厂
class HuaweiFactory : public AbstractFactory {
public:Phone* CreatePhone(string name){return new HuaweiPhone(name);}Computer* CreateComputer(string name){return new HuaweiComputer(name);}
};int main()
{cout << "------抽象工厂模式------" << endl;// 创建小米工厂AbstractFactory* xiaomiFactory = new XiaomiFactory();// 创建华为工厂AbstractFactory* huaweiFactory = new HuaweiFactory();//生产小米手机和小米平板Phone* xiaomiPhone = xiaomiFactory->CreatePhone("小米11");Computer* xiaomiComputer = xiaomiFactory->CreateComputer("平板《MI》");//为小米手机和小米平板安装操作系统xiaomiPhone->InstallPhoSystemOperation();xiaomiComputer->InstallComSystemOperation();//生产华为手机和华为平板Phone* huaweiPhone = huaweiFactory->CreatePhone("华为mate60");Computer* huaweiComputer = huaweiFactory->CreateComputer("平板《huawei》");//为华为手机和华为平板安装操作系统huaweiPhone->InstallPhoSystemOperation();huaweiComputer->InstallComSystemOperation();delete xiaomiPhone;delete xiaomiComputer;delete huaweiPhone;delete huaweiComputer;delete xiaomiFactory;delete huaweiFactory;return 0;
}
运行结果:

利用抽象工厂模式成功创建两个工厂,成功分别生产小米手机平板 和 华为手机平板
谢谢观看,祝顺利!
https://shusheng007.top/2020/02/16/abstract-factory-pattern/
相关文章:
设计模式:抽象工厂模式(讲故事易懂)
抽象工厂模式 定义:将有关联关系的系列产品放到一个工厂里,通过该工厂生产一系列产品。 设计模式有三大分类:创建型模式、结构型模式、行为型模式 抽象工厂模式属于创建型模式 上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定…...
C语言中的Strict Aliasing Rule
文章目录 前言没有警告不代表没有问题目前的应对方法 前言 很久没写了,水一篇。 最近有个代码在gcc 4.8.5上编译失败。编译失败的提示是: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werrorstrict-aliasing]查了下…...
单字符检测模型charnet使用方法,极简
Git链接 安装按照上面的说明,说下使用。 把tools下面的test做了一点修改,可以读取一张图片,把里面的单个字符都检测和识别出来。 然后绘制到屏幕上。 import torch from charnet.modeling.model import CharNet import cv2, os import num…...
Erlang、RabbitMQ下载与安装教程(windows超详细)
目录 安装Erlang 1.首先安装RabbitMQ需要安装Erlang环境 2.点击下载好的.exe文件进行傻瓜式安装,一直next即可 3.配置Erlang环境变量 安装RabbitMQ 1.给出RabbitMQ官网下载址:Installing on Windows — RabbitMQ,找到 2.配置RabbitMQ环境变量࿰…...
2023年终总结丨很苦,很酷!
文章目录 个人简介丨了解博主写在前面丨博主介绍年终总结丨博主成就年终总结丨博主想说年终总结丨学习芝士年终总结丨未来展望写在后面丨新年快乐 个人简介丨了解博主 主页地址:https://blog.csdn.net/m0_68111267 荣誉身份 ⭐2022年度CSDN 社区之星 Top6 ⭐2023年…...
鸿蒙 DevEco Studio 3.1 入门指南
本文主要记录开发者入门,从软件安装到项目运行,以及后续的学习 1,配置开发环境 1.1 下载安装包 官网下载链接 点击立即下载找到对应版版本 下载完成,按照提示默认安装即可 1.2 下载SDK及工具链 运行已安装的DevEco Studio&…...
ubuntu多用户环境dockerbug,卸载重装docker流程
之前不小心误操作删除重装docker,结果删除没成功,更没法重装,每次apt install都会报一个docker错误,虽然不影响软件的常规安装~但是现在还是需要装一个完整docker,还是选择删除一下,重点是关闭服…...
微信小程序开发系列-09自定义组件样式特性
微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…...
数据结构 模拟实现LinkedList单向不循环链表
目录 一、链表的简单介绍 二、链表的接口 三、链表的方法实现 (1)display方法 (2)size得到单链表的长度方法 (3)addFirst头插方法 (4)addLast尾插方法 (5…...
2023-12-24 LeetCode每日一题(收集足够苹果的最小花园周长)
2023-12-24每日一题 一、题目编号 1954. 收集足够苹果的最小花园周长二、题目链接 点击跳转到题目位置 三、题目描述 给你一个用无限二维网格表示的花园,每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐…...
Oracle 19c OCP 1z0 082考场真题解析第17题
考试科目:1Z0-082 考试题量:90 通过分数:60% 考试时间:150min 本文为云贝教育郭一军guoyJoe原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 17. Which three …...
掌握这十几个Python库才是爬虫界的天花板,没有你搞不定的网站!实战案例:Python全网最强电影搜索工具,自动生成播放链接
掌握这十几个Python库才是爬虫界的天花板,没有你搞不定的网站!实战案例:Python全网最强电影搜索工具,自动生成播放链接。 用来爬虫的十几个Python库。只要正确选择适合自己的Python库才能真正提高爬虫效率,到达高效爬虫目的。 1.PyQuery from pyquery import PyQuery as …...
模型 KANO卡诺模型
本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。需求分析。 1 卡诺模型的应用 1.1 餐厅需求分析故事 假设你经营一家餐厅,你想了解客户对你的服务质量的满意度。你可以使用卡诺模型来收集客户的反馈,并分析客户的…...
启明智显开源项目分享|基于Model 3c芯片的86中控面板ZX3D95CM20S-V11项目软硬件全开源
前言: 本文为4寸 480*480 RGB接口IPS全面触屏的86中控面板(RT-ThreadLVGL)软硬件开源干货内容,该项目是综合性非常强的RTOS系列项目!项目主控芯片使用 Model 3c,整体实现了简化版本的86中控面板的功能需求…...
Kind创建k8s - JAVA操作控制
kind 简介kind 架构安装 Kind (必备工具)docker官网kubectl官网kind官网校验安装结果 关于kind 命令 安装一个集群查看当前 Kubernetes 集群中的节点信息。查看当前命名空间下中的Pod(容器实例)的信息。使用 kind create cluster 安装,关于安…...
Qt sender()函数
sender函数原型: QObject *sender() const; 如果在由信号激活的插槽中调用该函数,返回指向发送信号的对象的指针,否则返回0,该指针仅在从该对象的线程上下文调用此函数的槽执行期间有效。 主要代码如下: 其中运用了Q…...
Java开发框架和中间件面试题(6)
目录 61.什么是Spring Batch? 62.请举例解释Required与Qualifier注解? 61.什么是Spring Batch? Spring batch是一个轻量级的,完善的批处理框架,他主要的目的在于帮助企业建立健壮,高效的批处理应用。Spri…...
附录E SQL入门之SQL保留字
本专栏目录 第1课 SQL入门之了解SQL 第2课 SQL入门之检索数据 第3课 SQL入门之排序检索数据 第4课 SQL入门之过滤数据 第5课 SQL入门之高级数据过滤 第6课 SQL入门之用通配符进行过滤 第7课 SQL入门之创建计算字段 第8课 SQL入门之使用数据处理函数 第9课 SQL入门之汇总数据 第…...
thinkphp6.0升级到8.0
目录 一:升级过程 二:报错处理 最近写的项目需要使用thinkphp8.0,之前的老项目需要从php6.0升级到8.0,特此记录下升级过程。 一:升级过程 查看版本: php think version,我目前的版本是6.1.4 生成thin…...
机器学习(一) -- 概述
系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理 未完待续…… 目录 系列文章目录 前言 一、机器学习定义(是什么) 二、机器学习的应用(能做什么) 三、***机器…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
