c++之享元模式
发布日期:2021-09-25 21:40:57 浏览次数:1 分类:技术文章

本文共 2003 字,大约阅读时间需要 6 分钟。

享元模式属于结构型模式。

定义:运用共享技术有效地支持大量细粒度的对象。

优点:减少单个实例的数目,来避免相似类的开销。

主要用于减少创建对象的数量,以减少内存的占用消耗和提高软件性能。

享元模式尝试重用现有的对象,如果没有找到,才会创建新的对象。

因为我们知道,对象是占据一定内存的,即使是一个空类,在c++中也占据1个字节的大小。
重复利用可以减少浪费,还能维护上一次的状态。

享元模式主要使用场景:

1、在设计之初,考虑到当系统中可能有很多对象的时候
2、这些对象还很占内存、操作重复

怎么使用:

一般会建立对应的关系表,维护已经创建的对象,通过创建对象时给他们的唯一标识,
从而通过标识从关系表中再次取出。

UML类图:

栗子场景:人在江湖飘,哪有不挨刀,加入一个门派接受保护成为了武林人士的首选。

其中Sects对应Flyweight,concreteSects对应concreateFlyweight,SectsFactory对应FlyweightFactory。

#include 
#include
using namespace std;//侠客类class KnightErrant{public: KnightErrant(string n) :m_name("") { m_name = n; } string getName() { return m_name; }private: string m_name; //侠客的名字};//抽象门派class Sects{public: virtual void JoinSects(KnightErrant ke) = 0;};//具体门派class ConcreteSects:public Sects{public: ConcreteSects(string n) :m_name("") { m_name = n; } void JoinSects(KnightErrant ke) { cout <<"大侠:"<< ke.getName().c_str() << " 加入" << m_name.c_str()<< endl; }private: string m_name;};//享元工厂类class SectsFactory{public: ~SectsFactory() { auto it = m_sectsMap.begin(); for (; it != m_sectsMap.end(); it++) { if (it->second) { delete it->second; it->second = nullptr; } } } Sects* getSects(string name) { if (m_sectsMap.find(name) == m_sectsMap.end()) { m_sectsMap[name] = new ConcreteSects(name); } return m_sectsMap[name]; } int getSectsCount() { int cnt = 0; auto it = m_sectsMap.begin(); for (; it != m_sectsMap.end(); it++) { cnt++; } return cnt; }private: map
m_sectsMap;};//客户端int main(){ SectsFactory *sectsFac = new SectsFactory; Sects *sects = sectsFac->getSects("华山派"); sects->JoinSects(KnightErrant("令狐冲")); sects->JoinSects(KnightErrant("任你行")); sects = sectsFac->getSects("嵩山派"); sects->JoinSects(KnightErrant("鸠摩智")); sects = sectsFac->getSects("峨眉派"); sects->JoinSects(KnightErrant("宋青书")); cout << "当前武林门派的个数:" << sectsFac->getSectsCount() << endl; if (sectsFac) { delete sectsFac; sectsFac = nullptr; } return 0;}

效果:

令狐冲和任你行都加入了华山派,鸠摩智和宋青书分别加入嵩山和峨眉。其中华山派已经已经存在,所以不会再new对象。

转载地址:https://blog.csdn.net/c_shell_python/article/details/107510454 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c++之桥接模式
下一篇:c++之适配器模式

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年03月10日 15时22分48秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

mysql新增一列_MySQL-ProxySQL中间件 2019-04-21
mysql 30入门_30分钟带你快速入门MySQL教程 2019-04-21
kangle主机怎么配置MySQL_kangle web服务+easypanel主机控制面板快速搭建网站和数据库以及管理空间详细教程... 2019-04-21
mysql 翻页 存储过程_MySQl通用翻页(存储过程) 2019-04-21
2020word替换所有文本_Excel字符函数(5):REPLACE、SUBSTITUTE查找替换函数之区别... 2019-04-21
win10安装ipython_win10环境 ipython app.py 8080 这里为什么是ipython 这步无法启动 2019-04-21
假定在MYSQL_假定在名称为教学库的数据库中包含有学生、课程和选课三个表,它们的定义如下 - 问答库... 2019-04-21
mysql多字段存储过程_mysql 的存储过程_多字段 2019-04-21
python怎么创建字符串列表_如何在python列表中为每个字符串创建子列表? 2019-04-21
vba ado 执行多条mysql 语句_access 按钮 多条sql语句 VBA 2019-04-21
弹性方法计算连续梁板内力_(梁板结构)混凝土结构设计复习题及答案 2019-04-21
java root权限_android java获得root权限调用linux命令 | 学步园 2019-04-21
java最小化窗体_JAVA窗体最大化最小化控制+托盘 2019-04-21
java 注解 数组默认值_Java注解默认值 2019-04-21
java流程语句_Java流程控制语句 2019-04-21
java require_java正则中的requireEnd和hitEnd 2019-04-21
400错误java_java代码转化成c#代码 报400错误 2019-04-21
java常见对象_Java 常见对象 02 2019-04-21
spring java配置_Spring Java配置要点 2019-04-21
共享内存 java_java - Java客户端-服务器编程:客户端之间的共享内存 - 堆栈内存溢出... 2019-04-21