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

news2024/11/15 8:47:07

与工厂模式对比

工厂模式

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

所以产品类的设计:

  • 抽象的产品类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 <|----- AiHaoBook


Book <|----- ChenGuangBook


Factory <|-- AiHaoFactory


Factory <|-- ChenGuangFactory


Pencil <|----- AiHaoPencil


Pencil <|----- ChenGuangPencil


Ruler <|----- AiHaoRuler


Ruler <|----- ChenGuangRuler



.ChenGuangFactory .....> .ChenGuangBook

.ChenGuangFactory .....> .ChenGuangPencil

.ChenGuangFactory .....> .ChenGuangRuler

.AiHaoFactory .....> .AiHaoBook
.AiHaoFactory .....> .AiHaoPencil
.AiHaoFactory .....> .AiHaoRuler


/' Aggregation relationships '/





/' Nested objects '/



@enduml

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

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

相关文章

BFC的含义以及应用

什么是BFC? BFC全称是Block Formatting context&#xff0c;翻译过来就是块级格式化上下文。简单来说&#xff0c;BFC是一个完全独立的空间。让空间里的子元素不会影响到外面的布局。&#x1f603;&#x1f603;&#x1f603; 如何触发BFC呢&#xff1f; mdn给了如下方式&a…

HMM-理论补充

目录 一.隐马尔科夫模型 二.HMM定义 三.隐马尔科夫模型的贝叶斯网络 四.HMM的确定 五.HMM的参数 六.HMM的参数总结 七.HMM的两个基本性质 1.齐次假设&#xff1a; 2.观测独立性假设&#xff1a; 八.HMM举例 九.HMM的3个基本问题 十.概率计算问题 1.直接算法 2.前向…

C语言学习笔记——程序环境和预处理

目录 前言 一、程序环境 1. 翻译环境 1.1 主要过程 1.2 编译过程 2. 运行环境 二、预处理 1. 预定义符号 2. #define 2.1 #define定义标识符 2.2 #define定义宏 2.3 命名约定和移除定义 3. 条件编译 4. 文件包含 结束语 前言 每次我们写完代码运行的时候都…

刷题28-有效的变位词

32-有效的变位词 解题思路&#xff1a; 注意变位词的条件&#xff0c;当两个字符串完全相等或者长度不等时&#xff0c;就不是变位词。 把字符串中的字符映射成整型数组&#xff0c;统计每个字符出现的次数 注意数组怎么初始化&#xff1a; int [] s1new int[26]代码如下&a…

C语言数据结构(一)—— 数据结构理论、线性表【动态数组、链表(企业版单向链表)】

数据结构理论1.1 数据数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可以操作的对象&#xff0c;是能被计算机识别&#xff0c;并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。1.2数据…

决策树、随机森林、极端随机树(ERT)

声明&#xff1a;本文仅为个人学习记录所用&#xff0c;参考较多&#xff0c;如有侵权&#xff0c;联系删除 决策树 通俗来说&#xff0c;决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友&#xff0c;于是有了下面的对话&#xff1a; 女儿&#x…

C++17 nodiscard标记符

文章目录前言弃值表达式nodiscard标记符函数非弃值声明类/枚举类/结构 非弃值声明返回类引用与类指针前言 在C 17中引入了一个标记符nodiscard&#xff0c;用于声明一个 “非弃值(no-discard)表达式”。那么在开始之前&#xff0c;我们需要了解一下什么是弃值表达式。 弃值表…

LearnOpenGL-入门-着色器

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网&#xff1a;https://learnopengl-cn.github.io/ 文章目录着色器GLSL数据类型输入与输…

SpringMVC - 12 - 注解配置SpringMVC(完全注解开发)

文章目录注解配置SpringMVC1、创建初始化类WebInit&#xff0c;代替web.xml2、创建SpringConfig配置类&#xff0c;代替spring的配置文件3、创建WebConfig配置类&#xff0c;代替SpringMVC的配置文件4、TestController进行测试注解配置SpringMVC 使用配置类和注解代替web.xml和…

友云生态全球高峰论坛暨长沙首届私董会隆重召开

由友云生态主办的“赢在巅峰决策未来”在友云生态全球新消费、新金融、新资本高峰论坛暨长沙首届私董会于2023年2月22日隆重召开&#xff01;本场私董会以“赢在巅峰 决策未来”为主题&#xff0c;从思维、定位、格局、布局四个角度探讨未来发展的全新动能。作为行业标杆性盛会…

网络应用之HTTP响应报文

HTTP响应报文学习目标能够知道HTTP响应报文的结构1. HTTP响应报文分析HTTP 响应报文效果图:响应报文说明:--- 响应行/状态行 --- HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述 --- 响应头 --- Server: Tengine # 服务器名称 Content-Type: text/html; charsetUTF-8 # 内容类…

【RabbitMQ笔记06】消息队列RabbitMQ七种模式之Topics主题模式

这篇文章&#xff0c;主要介绍消息队列RabbitMQ七种模式之Topics主题模式。 目录 一、消息队列 1.1、主题模式&#xff08;Topics&#xff09; 1.2、案例代码 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;编写生产者 &#xff08;3&#xff09;编写消费…

MapReduce 性能优化

MapReduce用于大规模数据集的并行运算&#xff0c;所以性能优化也是需要重点关注的内容&#xff0c;下面是我在学习过程中&#xff0c;对于MapReduce 性能优化的点&#xff0c;分享大家学习&#xff0c;enjoy~~ MapReduce的运行流程 以上是MapReduce的运行流程&#xff0c;所以…

Zebec社区上线ZIP-2(地平线升级行动)提案,海量激励将被释放

此前&#xff0c;Zebec社区在上线了投票治理系统Zebec Node后&#xff0c;曾上线了首个提案ZIP-1&#xff0c;对 Nautilus Chain 的推出进行了投票&#xff0c;作为 Zebec Chain 上线前的“先行链”&#xff0c;该链得到了社区用户的欢迎&#xff0c;投通过票的比例高达98.3%。…

负载均衡:LVS 笔记(二)

文章目录LVS 二层负载均衡机制LVS 三层负载均衡机制LVS 四层负载均衡机制LVS 调度算法轮叫调度&#xff08;RR&#xff09;加权轮叫调度&#xff08;WRR&#xff09;最小连接调度&#xff08;LC&#xff09;加权最小连接调度&#xff08;WLC&#xff09;基于局部性的最少链接调…

Apache Hadoop、HDFS介绍

目录Hadoop介绍Hadoop集群HDFS分布式文件系统基础文件系统与分布式文件系统HDFS简介HDFS shell命令行HDFS工作流程与机制HDFS集群角色与职责HDFS写数据流程&#xff08;上传文件&#xff09;HDFS读数据流程&#xff08;下载文件&#xff09;Hadoop介绍 用Java语言实现开源 允许…

SpringBoot:SpringBoot简介与快速入门(1)

SpringBoot快速入门1. SpringBoot简介2. SpringBoot快速入门2.1 创建SpringBoot项目&#xff08;必须联网&#xff0c;要不然创建失败&#xff0c;在模块3会讲到原因&#xff09;2.2 编写对应的Controller类2.3 启动测试3. Spring官网构建工程4. SpringBoot工程快速启动4.1 为什…

自学大数据的第一天

默认跳过基础部分,直接搞集群的部分,期间用到的linux基础默认大伙都会了(不会的话可以现用现查) Hadoop集群搭建 集群特点: 1,逻辑上分离~集群之间没有依赖,互不影响 2,某些进程往往部署在一台服务器上,但是属于不同的集群 3,MapReduce 是计算框架,代码层面的处理逻辑 集群的…

mindspore的MLP模型(多层感知机)

导入模块 import hashlib import os import tarfile import zipfile import requests import numpy as np import pandas as pd import mindspore import mindspore.dataset as ds from mindspore import nn import mindspore.ops as ops import mindspore.numpy as mnp from …

Python 内置函数eval()

Python 内置函数eval() eval(expression, globalsNone, localsNone) 函数用来执行一个字符串表达式&#xff0c;并返回表达式的值。 expression: 字符串表达式。global: 可选&#xff0c;globals必须是一个字典。locals: 可选&#xff0c;locals可以是任何映射对象。 示例 &…