抽象工厂模式(C++)

news2024/11/26 1:10:36

定义

提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。

使用场景

  • 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。
  • 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制"来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?

结构在这里插入图片描述

代码示例

//AbstractFactory.h
/****************************************************/
#ifndef ABSTRACT_FACTORY_H
#define ABSTRACT_FACTORY_H
#include<iostream>
using namespace std;

//形状抽象类接口shape
class shape
{
public:
	shape() {};
	virtual ~shape() {};
 
	virtual void draw() = 0;
	virtual double get_area() = 0;
	virtual void calculate_area() = 0;
 
	enum shape_type {rectangle,circle};
 
protected:
	double area;
};
 
//继承形状抽象接口的三角形类rectangle
class rectangle :shape
{
public:
	rectangle() { h = 2.5; k = 3.6; area = 0; };
	~rectangle() {};
 
	void draw();
	double get_area();
	void calculate_area();
private:
	double h;
	double k;
};	
 
void rectangle::draw()
{
	cout << "draw rectangle class" << endl;
}
 
double rectangle::get_area()
{
	return area;
}
 
void rectangle::calculate_area()
{
	area = h*k / 2;
}
 
//继承形状抽象接口的圆形类circle
class circle :shape
{
public:
	circle() { r = 4.8; area = 0; };
	~circle() {};
 
	void draw();
	double get_area();
	void calculate_area();
private:
	double r;
};
 
void circle::draw()
{
	cout << "draw circle class" << endl;
}
 
double circle::get_area()
{
	return area;
}
 
void circle::calculate_area()
{
	area = 3.14*r*r;
}
 
//颜色抽象类接口color
class color
{
public:
	color() {};
	virtual ~color() {};
 
	virtual void fill()=0;
 
	enum color_type { red, green };
};
 
//继承颜色抽象类的红色类red
class red :color
{
public:
	red() {};
	~red() {};
 
	void fill() { cout << "fill red color" << endl; };
};
 
//继承颜色抽象类的绿色类green
class green :color
{
public:
	green() {};
	~green() {};
 
	void fill() { cout << "fill green color" << endl; };
};
 
//抽象类工厂abstractfactory
class abstractfactory
{
public:
	abstractfactory() {};
	virtual ~abstractfactory() {};
 
	virtual shape* getshape(shape::shape_type type)=0;
	virtual color* getcolor(color::color_type type)=0;
 
	enum factory_type{tshape,tcolor};
};
 
//继承抽象工厂的形状工厂shapefactory
class shapefactory:abstractfactory
{
public:
	shapefactory() {};
	virtual ~shapefactory() {};
 
	shape* getshape(shape::shape_type type);
	color* getcolor(color::color_type type) { return NULL; };
};
 
shape* shapefactory::getshape(shape::shape_type type)
{
	switch (type)
	{
	case shape::rectangle:
		return (shape*)new rectangle();
	case shape::circle:
		return (shape*)new circle();
	default:
		return NULL;
	}
}
 
//继承抽象工厂的颜色工厂colorfactory
class colorfactory :abstractfactory
{
public:
	colorfactory() {};
	virtual ~colorfactory() {};
 
	shape* getshape(shape::shape_type type) { return NULL; };
	color* getcolor(color::color_type type);
};
 
color* colorfactory::getcolor(color::color_type type)
{
	switch (type)
	{
	case color::red:
		return (color*)new red();
	case color::green:
		return (color*)new green();
	default:
		return NULL;
	}
}
 
//工厂创造器类factoryproduct,通过传递颜色或形状信息来获取工厂
class factoryproduct
{
public:
	factoryproduct() {};
	~factoryproduct() {};
 
	abstractfactory* getfactory(abstractfactory::factory_type type);
};
 
abstractfactory* factoryproduct::getfactory(abstractfactory::factory_type type)
{
	switch (type)
	{
	case abstractfactory::tshape:
		return (abstractfactory*)new shapefactory();
	case abstractfactory::tcolor:
		return (abstractfactory*)new colorfactory();
	default:
		return NULL;
	}
}


#endif

//test.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "AbstractFactory.h"
int main()
{
	factoryproduct facput;
	abstractfactory *slfactory = facput.getfactory(abstractfactory::tshape);
	shape *k1 = slfactory->getshape(shape::rectangle);
	k1->draw();
	k1->calculate_area();
	cout << "area: " << k1->get_area() << endl;
 
	shape *k2 = slfactory->getshape(shape::circle);
	k2->draw();
	k2->calculate_area();
	cout << "area: " << k2->get_area() << endl;
 
	delete slfactory;
	slfactory = NULL;
	delete k1;
	k1 = NULL;
	delete k2;
	k2 = NULL;
 
	slfactory = facput.getfactory(abstractfactory::tcolor);
	color *k3 = slfactory->getcolor(color::red);
	k3->fill();
 
	color *k4 = slfactory->getcolor(color::green);
	k4->fill();
 
	delete slfactory;
	slfactory = NULL;
	delete k3;
	k3 = NULL;
	delete k4;
	k4 = NULL;
	
	return 0;
}

运行结果
在这里插入图片描述

要点总结

  • 如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的工广完全可以。
  • “系列对象”指的是在某一特定系列下的对象之间有相互依赖、或作用的关系。不同系列的对象之间不能相互依赖。
  • Abstract Factory模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。

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

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

相关文章

Java实现微信公众号自定义回复

第一版实现微信公众号自动回复&#xff1a; ● 实现自定义回复内容的管理&#xff0c;将关键词、半匹配、以及关注、默认回复等刷新到缓存中 ● 用户发送消息进行匹配后通过微信回复格式直接返回&#xff0c;如果内容存在文字和图片&#xff0c;文字通过xml格式直接返回&…

每天一道leetcode:剑指 Offer 50. 第一个只出现一次的字符(适合初学者)

今日份题目&#xff1a; 在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 s 只包含小写字母。 示例1 输入&#xff1a;s "abaccdeff" 输出&#xff1a;b 示例2 输入&#xff1a;s "" 输出&#xff1a; 提示 0 …

RocketMQ学习一入门使用

从0开始学习RocketMQ&#xff0c;这一节主要是windows下环境部署&#xff0c;以及我理解的基本使用流程。 安装 1.下载地址&#xff1a;下载 | RocketMQ 注意&#xff0c;如果是windows环境下需要下载的是二进制文件&#xff0c;也就是这一列。 2.下载后解压到自己想要的目录…

从零开始学习查询京东快递并查询超时状态的小技巧

随着电子商务的蓬勃发展&#xff0c;快递成为了我们日常生活中不可或缺的一部分。而在众多快递公司中&#xff0c;京东快递以其高效、可靠的服务赢得了广大用户的青睐。然而&#xff0c;查询京东快递并同时查询快递的超时状态却一直是用户们头痛的问题。今天&#xff0c;我将为…

学习笔记|LED点亮原理|三极管在数字电路中的应用|Keil中的Tab设置|C51中对准双向口|STC32G单片机视频开发教程(冲哥)|第四集-上:点亮LED

文章目录 1.LED点亮原理STC32G12K128LQFP64QFN64管脚图&#xff1a;Tips&#xff1a;USB-ISP下载程GPIO (general purpose intput output&#xff09;Tips&#xff1a;三极管在数字电路中的应用 2 新建工程Tips:Tab设置11.2 配置IO口注意: Tips&#xff1a;C51中对准双向口的解…

最新成果展示:GaN基Micro-LED热学模型数据库的开发及应用

由于GaN基Micro-LED表面积-体积比增加&#xff0c;其在热学方面的性质有别于大尺寸的LED&#xff0c;如缺陷复合导致的热效应将在发光区域中产生诸多“热”点&#xff0c;导致发光波长不均匀&#xff0c;这将影响后期显示系统的成像稳定性。针对上述问题&#xff0c;天津赛米卡…

shapely库的用法,高效处理点、线、面的几何关系和相关延申(GeoPandas 库)python

1、shapely库的基本用法 Shapely 是一个用于处理几何对象的 Python 库&#xff0c;它提供了各种函数和方法来进行空间分析和几何计算。下面是一些 Shapely 库的常见用法示例&#xff1a; 1. 创建几何对象&#xff1a; from shapely.geometry import Point, LineString, Poly…

uni——tab切换

案例展示 案例代码 <view class"tablist"><block v-for"(item,index) in tabList" :key"index"><view class"tabItem" :class"current item.id?active:" click"changeTab(item)">{{item.nam…

你真的懂OP吗?知道什么是OP吗?看完你就懂了!

运维到底是干什么的&#xff1f;估计连运维工程师本身都不清楚&#xff0c;小编各种搜索也没找到答案&#xff0c;问了很多运维老员工&#xff0c;终于总结出了运维工程师的工作内容。 01运维的定义本质上是对网络、服务器各个阶段的运营与维护&#xff0c;在成本、稳定性、效率…

混合云环境实现K8S可观测的6大策略

2023年&#xff0c;原生云应用及平台发展迅猛。大量企业都在努力发挥其应用程序的最大潜力&#xff0c;以确保极致的用户体验并推动业务增长。 混合云环境的兴起和容器化技术(如Kubernetes)的采用彻底改变了现代应用程序的开发、部署和扩展方式。 在这个数字舞台上&#xff0c;…

赴日IT工作之中日假期大对比!是你想要的程序员生活吗?

说了这么多关于工作方面的事宜&#xff0c;今天咱们来聊聊大家都关心的假期问题吧&#xff01;中国和日本的假期有什么区别呢&#xff1f;从天数上来看&#xff0c;其实中日假期都是16天左右&#xff0c;但是可能在调休方面&#xff0c;日本相比我国对员工层会有一点点优势&…

Linux环境下安装JDK(17)

1、官网下载 https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html 2、传到Linux上去&#xff0c;至于用什么工具&#xff0c;自行选择 3、虚拟机上&#xff0c;找到它&#xff0c;移到你想移的地方去 4、解压缩&#xff0c;换包名 tar -zxvf jdk…

Django快速入门

文章目录 一、安装1.创建虚拟环境&#xff08;virtualenv和virtualenvwrapper&#xff09;2. 安装django 二、改解释器三、创建一个Django项目四、项目目录项目同名文件夹/settings.py 五、测试服务器启动六、数据迁移七、创建应用八、基本视图1. 返回响应 response2. 渲染模板…

企业微信认证费用及年审的问题(收藏)

一、企业微信认证审核服务费用说明 企业微信认证的审核是委托第三方审核公司来履行的&#xff0c;对企业提交资料的真实性进行甄别和校验。针对中、大型规模企业&#xff0c;企业微信团队会以电话回访、征信核查等方式&#xff0c;对企业规模进行严格审核。针对大型规模企业&a…

Java分布式微服务3——Docker

文章目录 Docker介绍安装DockerDocker基础操作Docker服务的启动镜像命令容器命令1. 从docker hub去查看Nginx容器的运行命令2. 查看所有容器状态3. 查看容器日志4. 进入Nginx容器执行命令&#xff0c;修改Html内容&#xff0c;添加“Hello World”5. 停止与开始容器6. 删除容器…

错过NFT投资,你可能会后悔吗?

在过去的几年里&#xff0c;非同质化代币&#xff08;NFT&#xff09;以其独特性和创新性&#xff0c;迅速成为数字资产领域的热门话题。NFT代表了数字资产的所有权和独特性&#xff0c;为艺术、音乐、游戏和虚拟世界等领域提供了全新的可能性。然而&#xff0c;对于那些错过了…

使用 Docker 部署 Prometheus + Grafana 监控平台

使用 Docker 部署 Prometheus Grafana 监控平台 默认docker 已经安装好,我使用的是CentOS7 注意一定要开启服务器对应的端口 1. 安装Prometheus docker run -itd --nameprometheus --restartalways -p 9090:9090 prom/prometheus访问:http://ip:9090 2.安装Grafana #这里的$…

【AGC】付费下载上架下载后无法安装问题

【关键字】 AGC、付费下载、应用安装 【问题描述】 有开发者反馈用户下载后无法安装&#xff0c;采用未接入sdk&#xff0c;直接勾选付费-产品上架的方案&#xff0c;以前其他产品是能够正常安装的&#xff0c;现在不知道为啥。 报错信息&#xff1a;付费后显示“订单创建失…

对等离子体的认识

认识等离子体等离子体的产生等离子体的定义等离子体并不远 认识等离子体 等离子体的产生 物质由一百多种元素组成&#xff0c;不同元素结合成各种分子。大量的分子又依靠某种作用力结合或凝聚在一起&#xff0c;由于作用力的强弱不等而表现为各种不同的存在状态。 物质的存在状…

【数学基础】矩阵行列式

行列式意义是什么&#xff1f; 行列式等于它的各个列对应的向量张成的平行2n面体的体积&#xff0c;这是因为行列式是一个交替多重线性形式&#xff0c;而我们通常理解的欧式空间中的体积也是这样一个函数&#xff08;单位立方体体积为1&#xff0c;沿某条边扩大c倍体积就扩大…