设计模式:抽象工厂模式(讲故事易懂)

news2025/1/23 17:28:28

抽象工厂模式

定义:将有关联关系的系列产品放到一个工厂里,通过该工厂生产一系列产品。

设计模式有三大分类:创建型模式、结构型模式、行为型模式
抽象工厂模式属于创建型模式

在这里插入图片描述

上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定的产品,这样会有工厂类太多的问题,不容易维护。现实生活中,小米工厂除了生产手机还可能生产有关联的平板电脑,即一个工厂会生产多个有关联关系的系列产品,这种方式即抽象工厂模式。
比如:
小米工厂生产 小米手机小米平板电脑
华为工厂生产 华为手机华为平板电脑

故事铁蛋所在的富士康公司接到了为小米和华为代工手机和平板的任务,这个重任交给了打工人铁蛋,铁蛋是超级厉害的,铁蛋使用了抽象工厂模式解决了该问题。

铁蛋是怎么做的呢?他是这样做的:
一、定义手机相关的类(手机基类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/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12.29_黑马数据结构与算法笔记Java

目录 305 旅行商问题 动态规划 实现2 306 旅行商问题 动态规划 实现3 307 分治 概述 308 快速选择算法 分治 309 快速选择算法 数组第k大数 Leetcode215 310 快速选择算法 数组中位数 311 快速幂 分治 312 快速幂 Leetcode50 313 平方根整数部分 Leetcode69-1 314 平方…

从实际工作情况,介绍嵌入式(MCU)软件开发常用(通用)工具

目录 前言 1、代码阅读及编辑工具&#xff08;VSCode、Understand&#xff09; 2、代码对比工具&#xff08;Beyond Compare&#xff09; 3、代码仓库相关工具&#xff08;Git、SVN、Tortoise&#xff09; 4、文本编辑器&#xff08;Notepad&#xff09; 5、电脑文件搜索工…

arkts状态管理使用(@State、@Prop、@Link、@Provide、@Consume、@objectLink和@observed)

一、状态管理 1.在声明式UI中&#xff0c;是以状态驱动视图更新&#xff1a; ①状态&#xff08;State&#xff09;:指驱动视图更新的数据&#xff08;被装饰器标记的变量&#xff09; ②视图&#xff08;View&#xff09;:基于UI描述渲染得到用户界面 注意&#xff1a; ①…

Radar System Pro - Plug Play Solution

Radar System Pro是一款功能多样且可定制的资源,旨在通过功能齐全且易于使用的雷达系统增强您的Unity项目。无论您是在开发第一人称射击游戏、策略游戏还是太空探索模拟器,我们的雷达系统都将为您提供所需的工具,以创建引人入胜且身临其境的体验。 雷达系统是一个模块化资产…

mysql间隙锁demo分析

概述 通常用的mysql都是innodb引擎&#xff1b; 一般在update的时候用id都会认为是给行记录加锁&#xff1b; 在使用非唯一索引更新时&#xff0c;会遇到临键锁&#xff08;范围锁&#xff09;&#xff1b; 临键锁和表中的数据有关&#xff1b; mysq版本:8 隔离级别&#xf…

雨课堂作业整理

第一次作业 1.下列序列是图序列的是&#xff08; &#xff09; A.1&#xff0c;2&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;4&#xff0c;5 B.1&#xff0c;1&#xff0c;2&#xff0c;2&#xff0c;4&#xff0c;6&#xff0c;6 C.0&#xff0c;0&#xff0c;2&am…

解决基于VectorGrid的矢量瓦片Y轴偏移的问题

目录 前言 一、GeoServer的瓦片 1、GeoWebcache缓存配置 2、矢量瓦片本地缓存 3、瓦片访问 二、VectorGrid加载本地瓦片 1、加载关键代码 2、默认模式的问题 3、问题分析 4、tms参数修改 总结 前言 在前面的博文介绍中&#xff0c;在线连接如下&#xff1a;浅谈前端自定义…

AI与数字化映像:颜值开端,功能至上_光点科技

在人工智能的浪潮中&#xff0c;AI数字人的兴起正成为一个不可忽视的现象。随着ChatGPT等生成式AI算法的进步&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;的应用呈现出爆发性增长&#xff0c;不仅在技术圈引起广泛关注&#xff0c;也为元宇宙及其相关产业链带来了…

C++每日一练(8):图像相似度

题目描述 给出两幅相同大小的黑白图像&#xff08;用0-1矩阵&#xff09;表示&#xff0c;求它们的相似度。 说明&#xff1a;若两幅图像在相同位置上的像素点颜色相同&#xff0c;则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。…

非科班,培训出身,怎么进大厂?

今天分享一下我是怎么进大厂的经历&#xff0c;希望能给大家带来一点点启发&#xff01; 阿七毕业于上海一所大学的管理学院&#xff0c;在读期间没写过一行 Java 代码。毕业之后二战考研失利。 回过头来看&#xff0c;也很庆幸这次考研失利&#xff0c;因为这个时候对社会一…

精品Nodejs实现的在线菜谱食谱美食学习系统的设计与实现

《[含文档PPT源码等]精品Nodejs实现的在线菜谱学习系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows…

2023第三届中国高校大数据挑战赛B题代码

任务已完成&#xff0c;聚类效果很好&#xff08;主要在于数据的处理以及特征工程&#xff09;, 需代码si&#xff0c;yuer有限先到先得。

模型 KANO卡诺模型

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。需求分析。 1 卡诺模型的应用 1.1 餐厅需求分析故事 假设你经营一家餐厅&#xff0c;你想了解客户对你的服务质量的满意度。你可以使用卡诺模型来收集客户的反馈&#xff0c;并分析客户的…

Android Matrix画布Canvas旋转Rotate,Kotlin

Android Matrix画布Canvas旋转Rotate&#xff0c;Kotlin private fun f1() {val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.height, Bitmap.Config.…

基于价值认同的需求侧电能共享分布式交易策略(matlab完全复现)

目录 1 主要内容 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序完全复现《基于价值认同的需求侧电能共享分布式交易策略》&#xff0c;针对电能共享市场的交易机制进行研究&#xff0c;提出了基于价值认同的需求侧电能共享分布式交易策略&#xff0c;旨在降低电力市…

学习笔记15——前端和http协议

学习笔记系列开头惯例发布一些寻亲消息&#xff0c;感谢关注&#xff01; 链接&#xff1a;https://baobeihuijia.com/bbhj/ 关系 客户端&#xff1a;对连接访问到的前端代码进行解析和渲染&#xff0c;就是浏览器的内核服务器端&#xff1a;按照规则编写前端界面代码 解析标准…

数组(定义,静态初始化,地址值,元素访问,索引,遍历,动态初始化,两种初始化的区别,练习)

文章目录 1.数组概念&#xff1a; 2.数组的定义格式一&#xff1a;格式二&#xff1a;详解&#xff1a;注意点&#xff1a; 3.数组的静态初始化完整格式&#xff1a;格式详解&#xff1a;注意点&#xff1a;简化格式:练习1&#xff1a;练习2&#xff1a;练习3&#xff1a; 4.地…

【网络面试(2)】DNS原理-域名和IP地址的查询转换

从上一篇博客我们得知浏览器是如何生成了HTTP消息了&#xff0c;但是浏览器作为应用程序&#xff0c;是不具备向网络中发送请求的能力&#xff0c;而是需要委托给操作系统的内核协议栈来发送请求。在委托协议栈之前&#xff0c;浏览器还要做的一件事情就是将域名转换为IP地址。…

驾驶人类未来:Apollo自动驾驶系统的影响力

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言1. 什么是自定义指令&#xff1f;2. Apollo中的自定义指令2.1 查询中的自定义指令2.2 变更操作中的自定义指令 3. 自定义指令的实现结论 文章目录 前言1. 什…

二维动态规划问题,python解决最长回文子串

一个算法中的经典问题&#xff0c;求最长回文子串问题&#xff0c;其实是可以归于二维动态规划问题。 对于给定的一个字符串中&#xff0c;找到这个字符串中的回文子串&#xff0c;回文子串的概念是从前往后正向的读和从后往前反向的读都是完全相同的字符串。 对这个问题进行…