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

抽象工厂模式

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

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

在这里插入图片描述

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

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

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

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

相关文章

2、python-常见数据类型-字符串(str)

简介 1.可以使用引号 ( ’ 或 " ) 来创建字符串 2.字符串也是一种序列&#xff0c;因此&#xff0c;通用的序列操作&#xff0c;比如索引&#xff0c;分片&#xff08;切片&#xff09;&#xff0c;加法&#xff0c;乘法等对它同样适用 一.索引、切片、加法、乘法 x &…

NFS的基本使用

#江南的江 #每日鸡汤&#xff1a;岁月匆匆&#xff0c;时光荏苒&#xff0c;感悟人生路漫漫&#xff0c;不忘初心方得始终。 #初心和目标&#xff1a;和从前的自己博弈。 NFS(存储共享服务) 本文要点摘要&#xff1a; 下面将讨论什么是NFS&#xff0c;如何配置NFS&#xff0c;…

全新ui自动化测试框架教学——Cypress

前言 在现阶段自动化测试领域大规模普及的是selenium及appium等常规自动化测试工具&#xff0c;但在其中会有遇到很多影响因素导致测试结果不理想和不准确的情况发生。在经过Darren洋对自动化测试工具调研后&#xff0c;发现了Cypress这一款针对端到端的自动化测试工具&#xf…

52.网游逆向分析与插件开发-游戏反调试功能的实现-检测调试器

码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;be9f058bfaaa4b015f2659db842e07ee37e58996 代码下载地址&#xff0c;在 SRO_EX 目录下&#xff0c;文件名为&#xff1a;SRO_Ex检测调试器.z…

Python地理数据机器学习数学

地理数据 地理数据是存储在地理信息系统 (GIS) 中的位置信息。通过查看具有地理成分的数据&#xff0c;我们可以通过不同的视角来看待它。 用地理数据解决位置问题需要空间思维。让我们深入了解地理数据的类型、主题和来源。 类型 地理数据有不同类型&#xff0c;每种类型在…

认识计算机网络——计算机网络的概念

计算机网络是指将多台计算机通过通信介质连接起来&#xff0c;以便共享资源、交换信息和进行协作的技术体系。在现代社会中&#xff0c;计算机网络已经成为了各个领域的重要基础设施&#xff0c;改变了人们的生活方式和工作方式。本文将介绍计算机网络的基本概念、组成要素和发…

国产操作系统麒麟V10 SP2 设置应用自启动

下面以tomcat为例子&#xff0c;描述设置tomcat自启动的操作步骤&#xff1a;1.创建自启动脚本tomcat-autostart.desktop 内容&#xff1a; [Desktop Entry] Commenttomcat Comment[zh_CN]tomcat Exec/home/tomcat8/bin/startup.sh Hiddenfalse Nametomcat Name[zh_CN]tomcat …

vue3框架笔记

Vue Vue 是一个渐进式的前端开发框架&#xff0c;很容易上手。Vue 目前的版本是 3.x&#xff0c;但是公司中也有很多使用的是 Vue2。Vue3 的 API 可以向下兼容 2&#xff0c;Vue3 中新增了很多新的写法。我们课程主要以 Vue3 为主 官网 我们学习 Vue 需要转变思想&#xff0…

Springboot整合JSP-修订版本(Springboot3.1.6+IDEA2022版本)

1、问题概述&#xff1f; Springboot对Thymeleaf支持的要更好一些&#xff0c;Springboot内嵌的Tomcat默认是没有JSP引擎&#xff0c;不支持直接使用JSP模板引擎。这个时候我们需要自己配置使用。 2、Springboot整合使用JSP过程 现在很多的IDEA版本即使创建的项目类型是WAR工…

build.gradle记录

manifestPlaceholders 当我们想要动态的修改AndroidManifest.xml文件中一些熟悉时&#xff0c;可以通过manifestPlaceholders占位符来完成&#xff0c;首先在AndroidManifest.xml文件中预先设置一些占位符&#xff0c;例如 <meta-dataandroid:name"appkey"androi…

kivy BoxLayout说明

BoxLayout的特点 自动排列&#xff1a;BoxLayout会根据其orientation属性&#xff08;垂直或水平&#xff09;自动排列其子部件。这简化了布局的过程&#xff0c;尤其是当你有许多需要按顺序排列的部件时。可定制的间距和对齐&#xff1a;通过spacing属性&#xff0c;你可以控…

QT应用篇 三、QML自定义显示SpinBox的加减按键图片及显示值效果

QT应用篇 一、QT上位机串口编程 二、QML用Image组件实现Progress Bar 的效果 三、QML自定义显示SpinBox的加减按键图片及显示值效果 文章目录 QT应用篇前言一、qml需求二、使用组件1.SpinBox组件2.SpinBox中QML的使用 总结 前言 记录自己学习QML的一些小技巧方便日后查找 QT的…

Python魔法方法之__getattr__和getattribute

在Python中有这两个魔法方法容易让人混淆&#xff1a;__getattr__和getattribute。通常我们会定义__getattr__而从来不会定义getattribute&#xff0c;下面我们来看看这两个的区别。 __getattr__魔法方法 class MyClass:def __init__(self, x):self.x xdef __getattr__(self, …

【起草】【第十二章】定制ChatGPT数字亲人

身为普普通通的我们&#xff0c;不知道亲人们在哪一天就要离开这个世界 &#xff1f; 作为普普通通的程序员&#xff0c;我们可以为我们的亲人做点什么 &#xff1f; 让他们以数字资产形式留在人世间 ? 对话&#xff5c;6岁女孩病逝捐器官&#xff0c;妈妈&#xff1a;她去…

CEF线程之multi_threaded_message_loop参数

文章目录 JS调用C++方法,OnQuery消息传递线程过程详解CefSettings.multi_threaded_message_loop参数multi_threaded_message_loopexternal_message_pumpMainMessageLoopStd实验JS调用C++方法,OnQuery消息传递线程过程详解 之前的文章已经提到过JS调用C++方法的方式,我在开发…

2023纠结中前行? 2024继续还是放下?

喝下2023年的第一口雪碧&#xff0c;没有想像中的那么期待&#xff0c;甜水&#xff0c;放弃吧&#xff1b;还是吃些水果吧&#xff0c;不行吃块肉、喝两口酒~ 关于生活 挣扎了10几年的一颗牙“终于“掉了&#xff0c;几个月时间都在为新牙努力着&#xff1b;”进了医院就不在…

【ROS2】MOMO的鱼香ROS2(一)ROS2入门篇——从Ubuntu操作系统开启

从Ubuntu操作系统开启 引言1 术语汇总2 Ubuntu &#xff08;操作系统&#xff09;2.1 Ubuntu权限管理2.2 Ubuntu安装软件2.2.1 使用apt命令安装2.2.2 dpkg安装deb包2.2.3 make install源代码安装 2.3 Ubuntu之常用指令2.3.1 ls命令&#xff08;查看文件&#xff09;2.3.2 cd 命…

2024任务驱动Java程序设计讲课提纲

文章目录 为何采用任务驱动&#xff1f;任务驱动Java程序设计课程概述项目一&#xff1a;踏上Java开发之旅任务1&#xff1a;安装配置JDK并开发第一个Java程序1、安装JDK2、配置JDK环境变量3、开发第一个Java程序 任务2&#xff1a;搭建Java集成开发环境IntelliJ IDEA1、安装In…

Python多进程知识

一 传统编程的缺陷 传统编程的弊端&#xff1a; # 必须按照顺序执行&#xff0c;多个任务无法同时在还行 import timedef sing():for i in range(5):print("sing: hero")time.sleep(1) # 每唱一次&#xff0c;等1秒再唱def dance():for i in range(5):print(…

【网络基础】网络基础知识(学习笔记)

一、局域网的组成 交换机&#xff1a;组建局域网的设备(内网)路由器&#xff1a;连接内外网的设备 二、ip地址 ip地址&#xff1a;设备的唯一标识&#xff0c;32位二进制网络编码点分十进制&#xff1a;x.x.x.x 范围&#xff1a;0-255 三、子网掩码 局域网的同一网段才可以…