设计模式之享元模式(Flyweight)的C++代码实现

1、享元模式提出

面向对象很好地解决了抽象问题,但是创建对象会带来一定的内存开销。绝大部分情况下,创建对象带来的内存开销是可以忽略不计的;在有些情况下是需要谨慎处理的,如类A的sizeof是50个字节,则创建50*1024*100个A对象,则对象的内存大小约为5MB,这个是很占用内存的。享元模式就是使用运用共享技术支持创建大量的对象情况,并同时减少内存开销。

2、需求描述

有3种类型产品,这几种类型产品的形状和大小各不相同;现有1000个产品(3种类型),分别输出这些产品的类型和大小。

3、享元模式的代码实现

#include <iostream>
#include <string>
#include <map>
#include <vector>
namespace FlyWeight {
const std::string strG1="G1";
const std::string strG2="G2";
const std::string strG3="G3";class AbsProduct
{
public:virtual void Shape()=0;virtual void Size()=0;std::string m_strType;virtual ~AbsProduct(){};
};class ProductA:public AbsProduct
{
public:virtual void Shape(){std::cout << "rectangle" << std::endl;};virtual void Size(){std::cout << "60*60" << std::endl;};
};class ProductB:public AbsProduct
{
public:virtual void Shape(){std::cout << "triangle" << std::endl;};virtual void Size(){std::cout << "30*40*50" << std::endl;};
};class ProductC:public AbsProduct
{
public:virtual void Shape(){std::cout << "polygon" << std::endl;};virtual void Size(){std::cout << "30*40*50*60*60" << std::endl;};
};class ProductFact
{private:std::map<std::string,AbsProduct*>mapProduts;
public:AbsProduct* GetProduct(std::string strType){auto it = mapProduts.find(strType);if(it != mapProduts.end()){return it->second;}else{AbsProduct* newProduct = nullptr;if(strG1 == strType){newProduct = new ProductA();}else if(strG2 == strType){newProduct = new ProductB();}else{newProduct = new ProductC();}mapProduts[strType] = newProduct;return newProduct;}};void clear()
{for(auto it = mapProduts.begin(); it != mapProduts.end(); it++){delete (it->second);it->second = nullptr;}
}
};
}std::vector<std::string>vecProducts;
int main()
{for(int i = 0; i < 1000* 1; i++){if(i % 3 == 0){vecProducts.emplace_back(FlyWeight::strG1);}else if(i % 3 == 1){vecProducts.emplace_back(FlyWeight::strG2);}else{vecProducts.emplace_back(FlyWeight::strG3);}}FlyWeight::ProductFact obj;for(auto it = vecProducts.begin(); it != vecProducts.end();it++){std::cout << "\n";FlyWeight::AbsProduct *objIter= obj.GetProduct(*it);std::cout << objIter << std::endl;objIter->Size();objIter->Shape();}obj.clear();vecProducts.clear();return 0;
}

运行结果如下:

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

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

相关文章

IT运维:使用数据分析平台监控深信服防火墙

概述 深信服防火墙自身监控可以满足绝大部分需求&#xff0c;比如哪个应用占了最大带宽&#xff0c;哪个用户访问了哪些网站&#xff1f;这里我们为什么使用鸿鹄呢&#xff1f;因为我们要的是数据的处理和分析&#xff0c;比如某个用户在某个事件都做了哪些行为&#xff0c;这个…

提示丢失vcomp140.dll怎么办?如何快速修复vcomp140.dll丢失问题

最近我遇到了一个程序启动失败的问题&#xff0c;错误提示显示缺少了vcomp140.dll文件。经过一番研究和尝试&#xff0c;我终于成功修复了这个问题。在这里&#xff0c;我将分享一下我的修复方法。 目录 vcomp140.dll是什么&#xff1f; 如何快速修复呢&#xff1f; vcomp140…

DR模式 LVS负载均衡群集

数据包流向分析&#xff1a; &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xff08;2&#xff09;Director Server 和 Re…

K8S用户管理体系介绍

1 K8S账户体系介绍 在k8s中&#xff0c;有两类用户&#xff0c;service account和user&#xff0c;我们可以通过创建role或clusterrole&#xff0c;再将账户和role或clusterrole进行绑定来给账号赋予权限&#xff0c;实现权限控制&#xff0c;两类账户的作用如下。 server acc…

06-加密算法

加密算法 一、前言知识1、加密解密2、MD5&#xff08;最常见&#xff09;3、SHA4、进制5、时间戳6、URL编码7、base64编码8、unescape编码9、AES加密10、DES&#xff08;类似于base64&#xff09; 二、常见加密形式算法解析三、演示案例1、某 CTF 比赛题目解析2、某 CMS 密码加…

企业电子招投标采购系统源码之电子招投标的组成 tbms

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为…

拉丁方设计资料的方差分析(SPSS版+SAS版)

拉丁方设计&#xff08;Latin square design&#xff09;&#xff1a;实验研究中涉及一个处理因素和两个控制因素&#xff0c;每个因素的类别数或水平数相等&#xff0c;此时可采用拉丁方设计&#xff0c;将两个控制因素分别安排在拉丁方设计的行和列上。该设计类型仍为单因素方…

【jenkins】jenkins流水线构建打包jar,生成docker镜像,重启docker服务的过程,在jenkins上一键完成,实现提交代码自动构建的功能

【jenkins】jenkins流水线构建打包jar&#xff0c;生成docker镜像&#xff0c;重启docker服务的过程&#xff0c;在jenkins上一键完成&#xff0c;实现提交代码自动构建&#xff0c;服务重启&#xff0c;服务发布的功能。一键实现。非常的舒服。 1. 启动脚本 shell脚本 这是 s…

TOMCAT的多实例部署和动静分离

tomcat的多实例 动静分离 排错小工具&#xff1a; telnet工具&#xff1a;yum -y install telnet telnet工具用于测试端口是否正常 telnet 20.0.0.101 80Tomcat多实例部署&#xff1a; 一台服务器上有多个tomcat的服务 1.安装好 jdk 2.安装 tomcat cd /opt tar zxvf apache-…

re学习(33)攻防世界-secret-galaxy-300(动态调试)

下载压缩包&#xff1a; 下载链接&#xff1a;https://adworld.xctf.org.cn/challenges/list 参考文章&#xff1a;攻防世界逆向高手题之secret-galaxy-300_沐一 林的博客-CSDN博客 发现这只是三个同一类型文件的三个不同版本而已&#xff0c;一个windows32位exe&#xff0…

爬虫逆向实战(十三)--某课网登录

一、数据接口分析 主页地址&#xff1a;某课网 1、抓包 通过抓包可以发现登录接口是user/login 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有一个password加密参数&#xff0c;还有一个browser_key这个可以写死不需要关心 请求头…

回归预测 | MATLAB实现GRU门控循环单元多输入多输出

回归预测 | MATLAB实现GRU门控循环单元多输入多输出 目录 回归预测 | MATLAB实现GRU门控循环单元多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现GRU门控循环单元多输入多输出&#xff0c;数据为多输入多输出预测数据&#xff0c;输入10个…