当前位置: 首页 > news >正文

3.抽象工厂模式(Abstract Factory)

与工厂模式对比

工厂模式

工厂模式是类创建模式。在工厂模式中,只需要生产同一种产品,只不过是生产厂家不同。

所以产品类的设计:

  • 抽象的产品类Product
  • 具体的产品类Product_AProduct_B, Product_C, Product_D……

工厂的设计:

  • 抽象的工厂Factory
  • 与产品对应的Factory_A, Factory_B, Factory_C, Factory_D……

特点是每增加一个厂家,就会成对地增加类。
不考虑增加产品种类,否则就会升级为抽象工厂模式。

抽象工厂模式

抽象工厂模式是对象创建模式。抽象工厂模式中,每个厂家都生产多种产品

反映到我们的工厂类,就是需要提供更多的产品制造接口。

优点

每增加一个厂家,就要有一个具体的工厂类产生、多个具体的产品类产生。
只需让具体的工厂继承Factory抽象的工厂、具体的产品继承抽象的产品、具体的工厂负责制造具体的产品。对其他类没有影响。

缺点/限制

当增加一种新的产品时(不推荐),每个已有的工厂都需要增加新的方法,来制造对应的产品,违背了开闭原则。

产品已有的种类是固定的,而品阶/等级/厂商可以变。

有时这也算是个优点,因为将每个工厂的产品视为一套产品,这很符合一些应用场合。
例如对不同的操作系统提供一套UI组件,对不同操作系统使用不同的具体工厂来产生一套组件。

又比如在数据相关类的设计中,有不同的数据库,不同的数据库会给出不同的连接类、语句类。数据库就像具体的工厂,连接类、语句类则是产品。不同的数据库自成一套。

类图

下面的例子模拟不同的文具工厂生产各种文具,
假设厂家有:爱好,晨光……
假设文具有:书、铅笔、尺子……

在这里插入图片描述

代码

#include <iostream>
#include <memory>
#include <vector>using namespace std;class Book;
class AiHaoBook;
class ChenGuangBook;class Pencil;
class AiHaoPencil;
class ChenGuangPencil;class Ruler;
class AiHaoRuler;
class ChenGuangRuler;class Factory;
class ChenGuangFactory;
class AiHaoFactory;class Factory {
public:virtual ~Factory() = default;virtual unique_ptr<Book> make_book() = 0;virtual unique_ptr<Pencil> make_pencil() = 0;virtual unique_ptr<Ruler> make_ruler() = 0;
};class AiHaoFactory : public Factory {
public:unique_ptr<Book> make_book() override;unique_ptr<Pencil> make_pencil() override;unique_ptr<Ruler> make_ruler() override;
};class ChenGuangFactory : public Factory {
public:unique_ptr<Book> make_book() override;unique_ptr<Pencil> make_pencil() override;unique_ptr<Ruler> make_ruler() override;
};class Book {
public:virtual ~Book() = default;virtual string get_brand() const = 0;string get_type() const;
private:static const string type;
};class Pencil {
public:virtual ~Pencil() = default;virtual string get_brand() const = 0;string get_type() const;
private:static const string type;
};class Ruler {
public:virtual ~Ruler() = default;virtual string get_brand() const = 0;string get_type() const;
private:static const string type;
};const string Book::type ("Book");
const string Pencil::type ("Pencil");
const string Ruler::type ("Ruler");string
Book::get_type() const
{return Book::type;
}string
Pencil::get_type() const
{return Pencil::type;
}string
Ruler::get_type() const
{return Ruler::type;
}class AiHaoBook: public Book {
public:string get_brand() const override;
private:static const string brand;
};class AiHaoPencil : public Pencil {
public:string get_brand() const override;
private:static const string brand;
};class AiHaoRuler : public Ruler {
public:string get_brand() const override;
private:static const string brand;
};class ChenGuangBook: public Book {
public:string get_brand() const override;
private:static const string brand;
};class ChenGuangPencil : public Pencil {
public:string get_brand() const override;
private:static const string brand;
};class ChenGuangRuler : public Ruler {
public:string get_brand() const override;
private:static const string brand;
};const string AiHaoBook::brand ("AiHao");
const string AiHaoPencil::brand ("AiHao");
const string AiHaoRuler::brand ("AiHao");const string ChenGuangBook::brand ("ChenGuang");
const string ChenGuangPencil::brand ("ChenGuang");
const string ChenGuangRuler::brand ("ChenGuang");
string
AiHaoBook::get_brand() const
{return AiHaoBook::brand;
}string
AiHaoPencil::get_brand() const
{return AiHaoPencil::brand;
}string
AiHaoRuler::get_brand() const
{return AiHaoRuler::brand;
}string
ChenGuangBook::get_brand() const
{return ChenGuangBook::brand;
}string
ChenGuangPencil::get_brand() const
{return ChenGuangPencil::brand;
}string
ChenGuangRuler::get_brand() const
{return ChenGuangRuler::brand;
}unique_ptr<Book>
AiHaoFactory::make_book()
{return make_unique<AiHaoBook>();
}unique_ptr<Pencil>
AiHaoFactory::make_pencil()
{return make_unique<AiHaoPencil>();
}unique_ptr<Ruler>
AiHaoFactory::make_ruler()
{return make_unique<AiHaoRuler>();
}unique_ptr<Book>
ChenGuangFactory::make_book()
{return make_unique<ChenGuangBook>();
}unique_ptr<Pencil>
ChenGuangFactory::make_pencil()
{return make_unique<ChenGuangPencil>();
}unique_ptr<Ruler>
ChenGuangFactory::make_ruler()
{return make_unique<ChenGuangRuler>();
}int
main (void)
{vector<unique_ptr<Factory>> makers;makers.emplace_back (make_unique<AiHaoFactory>());makers.emplace_back (make_unique<ChenGuangFactory>());for (auto &maker : makers) {unique_ptr<Book> book = maker->make_book();unique_ptr<Pencil> pencil = maker->make_pencil();unique_ptr<Ruler> ruler = maker->make_ruler();cout << book->get_brand() << " " << book->get_type() << endl;cout << pencil->get_brand() << " " << pencil->get_type() << endl;cout << ruler->get_brand() << " " << ruler->get_type() << endl;}
}

plantuml

@startuml/' Objects '/class AiHaoBook {+get_brand() : string---brand : static const string
}class AiHaoFactory {+make_book() : unique_ptr<Book>+make_pencil() : unique_ptr<Pencil>+make_ruler() : unique_ptr<Ruler>
}class AiHaoPencil {+get_brand() : string---brand : static const string
}class AiHaoRuler {-brand : static const string+get_brand() : string
}abstract class Book {+{abstract}~Book()+virtual get_brand() : string+get_type() : string---type : static const string
}class ChenGuangBook {+get_brand() : string---brand : static const string
}class ChenGuangFactory {+make_book() : unique_ptr<Book>+make_pencil() : unique_ptr<Pencil>+make_ruler() : unique_ptr<Ruler>
}class ChenGuangPencil {+get_brand() : string---brand : static const string
}class ChenGuangRuler {+get_brand() : string---brand : static const string
}abstract class Factory {+{abstract}~Factory()+virtual make_book() : unique_ptr<Book>+virtual make_pencil() : unique_ptr<Pencil>+virtual make_ruler() : unique_ptr<Ruler>
}abstract class Pencil {+{abstract}~Pencil()+virtual get_brand() : string+get_type() : string---type : static const string
}abstract class Ruler {+{abstract}~Ruler()+virtual get_brand() : string+get_type() : string---type : static const string
}/' Inheritance relationships '/Book <|----- AiHaoBookBook <|----- ChenGuangBookFactory <|-- AiHaoFactoryFactory <|-- ChenGuangFactoryPencil <|----- AiHaoPencilPencil <|----- ChenGuangPencilRuler <|----- AiHaoRulerRuler <|----- ChenGuangRuler.ChenGuangFactory .....> .ChenGuangBook.ChenGuangFactory .....> .ChenGuangPencil.ChenGuangFactory .....> .ChenGuangRuler.AiHaoFactory .....> .AiHaoBook
.AiHaoFactory .....> .AiHaoPencil
.AiHaoFactory .....> .AiHaoRuler/' Aggregation relationships '//' Nested objects '/@enduml

相关文章:

3.抽象工厂模式(Abstract Factory)

与工厂模式对比 工厂模式 工厂模式是类创建模式。在工厂模式中&#xff0c;只需要生产同一种产品&#xff0c;只不过是生产厂家不同。 所以产品类的设计&#xff1a; 抽象的产品类Product具体的产品类Product_A&#xff0c;Product_B, Product_C, Product_D…… 工厂的设计…...

synchronized底层如何实现?什么是锁的升级、降级?

第16讲 | synchronized底层如何实现&#xff1f;什么是锁的升级、降级&#xff1f; 我在上一讲对比和分析了 synchronized 和 ReentrantLock&#xff0c;算是专栏进入并发编程阶段的热身&#xff0c;相信你已经对线程安全&#xff0c;以及如何使用基本的同步机制有了基础&#…...

node环境搭建以及接口的封装

node环境搭建 文章目录node环境搭建1.在cmd中输入命令安装express&#xff08;全局&#xff09;2.在自己的项目下安装serve3.测试接口4.连接mysql4.1 创建数据表4.2 在serve目录下建db下的sql.js4.3 sql.js4.4 在serve路径下安装mysql4.5 在routes 中引入并发送请求4.6 请求到数…...

跟着我从零开始入门FPGA(一周入门系列)第七天

7、设计一个只有4条指令的CPU我们要设计一个简单的CPU既然做CPU&#xff0c;我们要做流水线的&#xff0c;要简单&#xff0c;做2级流水线就够了。为了实例的简单&#xff0c;我们选择设计一个8bit的MCU的内核仍然我们要简单&#xff0c;所以选择RISC的内核&#xff0c;类似PIC…...

Synopsys Sentaurus TCAD系列教程之--Sde概述

Sde 方便处理rule check相关的问题。同时也能让使用者进一步了解器件结构、掺杂和引线等基本操作。Sde用于搭建结构&#xff0c;重新优化网格&#xff0c;提供.mesh文件供后面Sdevice仿真&#xff0c;主要包含以下几部分&#xff1a; 第一部分&#xff1a; Scheme BasicsDefi…...

计算结构体大小

计算结构体大小 目录计算结构体大小一. 结构体内存对齐1. 简介2. 嵌套结构体二. offsetof三. 内存对齐的意义四. 修改默认对齐数一. 结构体内存对齐 以字节&#xff08;bety&#xff09;为单位 1. 简介 对于结构体成员在内存里的存储&#xff0c;存在结构体的对齐规则&#…...

第二十一篇 数据增强

文章目录 摘要1、数据增强的作用2、常用的图像增强方法2.1、一些辅助函数ToTensorToPILImageNormalizeResize2.2、中心裁剪2.3、亮度、对比度和颜色的变化2.4、随机裁剪2.5、随机灰度与灰度2.6、水平/竖直翻转2.6.1、水平翻转2.6.2、垂直旋转2.7、随机角度旋转2.8、随机仿射变换…...

记一次线上es慢查询导致的服务不可用

现象 某日线上业务同学反馈订单列表查询页面一直loding&#xff0c;然后提示请求超时&#xff0c;几分钟之后恢复正常 接到报障之后&#xff0c;马上根据接口URL&#xff0c;定位到了请求链路&#xff0c;发现是es查询超时&#xff0c;这里我们的业务订单表数据是由几百万的&a…...

分布式之ZAB协议

写在前面 假定我们现在使用zk执行了如下的指令&#xff1a; [zk: 192.168.0.10:2181(CONNECTED) 0] create /dongshidaddy 123 Created /dongshidaddy [zk: 192.168.0.10:2181(CONNECTED) 1] create /dongshidaddy/mongo 456 Created /dongshidaddy/mongo假定因为节点故障最终…...

MySQL binlog常用命令及设置清理时间

MySQL binlog常用命令及设置清理时间1 binlog 基本概念2 binlog常用命令3 清理MySQL的binlog日志3.1 自动清理3.2 手动清理文章参考&#xff1a; http://www.360doc.com/content/22/0418/08/65840191_1027038859.shtml https://www.cnblogs.com/kiko2014551511/p/11532426.html…...

Windows下载安装Prometheus

目录 资料 下载 解压 点击prometheus.exe运行 资料 Prometheus是一个开源的系统监控和报警系统&#xff0c;同时也支持多种exporter采集数据&#xff0c;还支持pushgateway进行数据上报&#xff0c;Prometheus性能足够支撑上万台规模的集群。 官网&#xff1a;https://pr…...

0-1背包、完全背包及其变形【零神基础精讲】

来源0x3f&#xff1a;https://space.bilibili.com/206214 三叶姐的对背包问题的总结&#xff1a;【宫水三叶】详解完全背包一维空间优化推导&#xff08;附背包问题攻略&#xff09;https://leetcode.cn/circle/discuss/GWpXCM/ 文章目录0-1背包、完全背包及其拓展&#xff08;…...

OpenStack

OpenStack优势&#xff1a; 1、模块松耦合。 2、组件配置较为灵活。 3、二次开发容易 OpenStack共享服务组件&#xff1a; 1、数据库服务&#xff1a;MongoDB 2、消息列队&#xff1a;RabbitMQ 3、缓存&#xff1a;Redis 4、存储&#xff1a;Ceph 5、负载均衡&#xff…...

Spring Boot整合Kaptcha实现验证码功能

目录一、前言1.Kaptcha 简介2.Kaptcha 详细配置表二、实现1.整合kaptcha&#xff0c;创建kaptcha的工具类1.1 添加依赖1.2 创建KaptchaConfig工具类2 编写接口&#xff0c;在接口中使用 kaptcha 工具类来生成验证码图片&#xff08;验证码信息&#xff09;并返回3 登录时从sess…...

【2023】某python语言程序设计跟学第一周内容

本文说明&#xff1a; 案例内容为北理工python语言程序设计课程&#xff0c;如有不妥请联系&#xff01; 目录温度转换案例&#xff1a;执行结果&#xff1a;代码解析&#xff1a;白话说明&#xff1a;举一反三&#xff1a;根据输入半径求圆周长或面积执行结果&#xff1a;温度…...

C#学习记录——接口的实现

一小部分知识精英依旧直面核心困难&#xff0c;努力地进行深度钻研&#xff0c;生产内容&#xff1b;而大多数信息受众始终在享受轻度学习&#xff0c;消费内容。如果我们真的希望在时代潮流中占据一席之地&#xff0c;那就应该尽早抛弃轻松学习的幻想&#xff0c;锤炼深度学习…...

“ChatGPT之父”Sam Altman:我是如何成功的?

背靠微软&#xff0c;OpenAI能拳打谷歌&#xff0c;脚踢Meta&#xff0c;它背后的男人&#xff0c;必然不简单。 让我们来看一看&#xff0c;Sam Altman是如何一步步成长为今天这个搅动全世界的男人。 山姆奥特曼&#xff08;Sam Altman&#xff09; 成长和创业经历 在YC创始…...

jQuery发送Ajax请求的几种方式

概述JQuery发送ajax请求的方法有很多&#xff0c;其中最基本的方法是$.ajax&#xff0c;在其中封装的方法有 $.get, $post等。我们分别举了不同的示例。数据格式首先&#xff0c;浏览器与服务器之间传输数据所采用的格式&#xff0c;比较常见的有json&#xff0c;jsonp&#xf…...

Android实现连线题效果

效果图全部正确&#xff1a;有对有错&#xff1a;结果展示&#xff0c;纯黑色&#xff1a;支持图片&#xff1a;实现思路仔细分析可以发现&#xff0c;连线题的布局可以分为两部分&#xff0c;一个是左右两列矩形&#xff0c;另一个是他们之间的连线。每个矩形的宽高都一样&…...

以数据 见未来!首届未来数商大会成功举办

2月25日&#xff0c;2023未来数商大会在杭州未来科技城学术交流中心举办。大会发布了数商产业趋势研究报告&#xff0c;首次提出并探讨了完整的数商产业概念&#xff0c;并成立了未来数商联盟&#xff0c;开通了浙江大数据交易服务平台余杭专区。会上&#xff0c;杭州未来科技城…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...

GeoServer发布PostgreSQL图层后WFS查询无主键字段

在使用 GeoServer&#xff08;版本 2.22.2&#xff09; 发布 PostgreSQL&#xff08;PostGIS&#xff09;中的表为地图服务时&#xff0c;常常会遇到一个小问题&#xff1a; WFS 查询中&#xff0c;主键字段&#xff08;如 id&#xff09;莫名其妙地消失了&#xff01; 即使你在…...