类写的不够规范,目的是为了缩短篇幅,实际中其不要这样做。

参考文章:

  1、 http://c.biancheng.net/view/1371.html

1、概述

  A、享元,我的理解是: 共享的模块单元。实现的是复用代码。

  B、非享元,非享元类型要作为享元的接口的参数。   

2.、模式的结构
  享元模式的主要角色有如下。
  A、 抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
  B、 具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
  C、 非享元(Unsharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。
  D、 享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。

  

3、范例

  例如: 需要接受组播数据,组播ip相同,端口不同。收到的数据单独处理。

4、抽象享元角色

// 抽象共享单元
class fw_adress
{
public:
virtual void operation(unshared_unit port) = 0;
};

5、具体享元

// 具体共享角色
class fly_weight_mine : public fw_adress
{
public:
fly_weight_mine(std::string str_ip)
{
_udp_cast_ip = str_ip; cout << "\n 具体共享IP【 " << str_ip.c_str() << " 】被创建\n";
} void operation(unshared_unit port)
{
cout << "\n 具体共享IP【 " << _udp_cast_ip.c_str() << " 】被调用, ";
cout << "非共享端口=" << port.get_port() <<"\n";
} private:
std::string _udp_cast_ip;
};

6、非共享元

// 非共享模块
class unshared_unit
{
public:
unshared_unit(int port) { _port = port; } int get_port() { return _port; } private:
int _port;
};

7、享元工厂

  工厂负责创建对象,用map维护了一个对象集

// 享元工厂,负责生产对应的对象
class flyweight_factory
{
public: // 释放资源
virtual ~flyweight_factory()
{
for each(auto index in _map_adress)
{
if (index.second)
{
cout << "\n 正在释放对象 = " << index.first.c_str();
delete index.second;
}
}
} // 工厂负责创建对应的对象
fw_adress* get_element(std::string str_ip)
{
fw_adress* pret_val = nullptr;
std::map<std::string, fw_adress* > :: iterator& it = _map_adress.find(str_ip); // 1、 找到了, 说明已经创建,就返回已经创建的对象
if (_map_adress.end() != it)
{
pret_val = it->second;
cout << "已经找到【 " << str_ip.c_str() << " 】,放回已经创建的对象\n";
}
// 2、 没有找到,就创建
else
{
pret_val = new fly_weight_mine(str_ip); // 2.1 创建失败
if (nullptr == pret_val)
cout << "\n\n 创建失败, str_ip = " << str_ip.c_str() << endl;
// 2.2 创建成功
else
_map_adress.insert(make_pair(str_ip, pret_val));
} return pret_val;
} private: // 维护对象使用,提高内存使用效率
std::map<std::string, fw_adress *> _map_adress;
};

8、调用

void call_fly_weight()
{
std::unique_ptr<flyweight_factory> pfact(new(std::nothrow) flyweight_factory);
if (!pfact)
{
cout << "\n\n 享元 工厂创建失败";
return;
} // 内部管理,无需外界释放 // 组播IP
std::string str_udp1("233.100.100.199");
std::string str_udp2("233.100.100.200");
// 组播端口
unshared_unit us1(10086);
unshared_unit us2(10087);
unshared_unit us3(10088);
unshared_unit us4(10089);
unshared_unit us5(20086); cout << "\n 1、下面开始创建对象:\n";
fw_adress *fw1 = pfact->get_element(str_udp1);
fw_adress *fw2 = pfact->get_element(str_udp1);
fw_adress *fw3 = pfact->get_element(str_udp1); fw_adress *fw11 = pfact->get_element(str_udp2);
fw_adress *fw12 = pfact->get_element(str_udp2); cout << "\n\n 2、对象创建完毕,下面开始调用非享元模块\n"; if (fw1)
fw1->operation(us1); if (fw2)
fw2->operation(us2); if (fw3)
fw3->operation(us3); if (fw11)
fw11->operation(us4); if (fw12)
fw12->operation(us5);
}

9、输出结果:

c++ 设计模式概述之享元的更多相关文章

  1. 面向对象设计模式之Flyweight享元模式(结构型)

    动机:采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同 时,让外部客户程序仍然能够透明地使用面向对象的 ...

  2. Java设计模式之《享元模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ...

  3. 设计模式学习之享元模式(Flyweight,结构型模式)(20)

    转:http://terrylee.cnblogs.com/archive/2006/03/29/361767.html 摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是 ...

  4. 设计模式学习心得<享元模式 Flyweight>

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ...

  5. Java设计模式学习记录-享元模式

    前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ...

  6. 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  7. C#设计模式之十一享元模式(Flyweight Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第六个模式,该模式是[享元模式],英文名称是:Flyweight Pattern.还是老套路,先从名字上来看看.“享元”是不是可以这样理解,共享“单元”,单元 ...

  8. 设计模式(11)--Flyweight(享元模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 2.模式特点: 享元模 ...

  9. 设计模式之flyweight享元模式

    运用共享技术支持大量细粒度对象的使用 Flyweight模式(享元) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模 ...

随机推荐

  1. [转载]CSP-J/S 第一轮知识点选讲

    CSP-J/S 第一轮知识点选讲 转载自这里 感谢原博主的大力整理! 信息学史及基本知识 一.信息学及计算机史 计算机的顶级奖项:图灵奖.冯·诺依曼奖 图灵奖:由ACM(美国计算机协会)设立于1966 ...

  2. 【GS模型】使用R包sommer进行基因组选择的GBLUP和RRBLUP分析?

    目录 简介 GS示例代码 简介 R包sommer内置了C++,运算速度还是比较快的,功能也很丰富,可求解各种复杂模型.语法相比于lme4包也要好懂一些. 建议查看文档:vignette("v ...

  3. Anaconda建立新的环境,出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url ...... 解决过程

    2020.3.7准备scrapy,使用anaconda创建一个新的环境,执行"conda create -n scrapyEnv python=3.6",结果出现了"Co ...

  4. EXCEL-表格安全性:加密给与不同操作权限、表格怎么不让别人复制粘贴?

    1.下方表格名称右键-保护工作表,将所有选项取消勾选 然后设置一个密码就可以了 2.文件旁的三条线点开-选项-安全性,设置编辑权限密码,确定

  5. SpringBoot整合Shiro 四:认证+授权

    搭建环境见: SpringBoot整合Shiro 一:搭建环境 shiro配置类见: SpringBoot整合Shiro 二:Shiro配置类 shiro整合Mybatis见:SpringBoot整合 ...

  6. jenkins的sonarqube之代码检测的两种方法

    #:sonarqube下载地址,我们安装6.7  高版本已经不支持MySQL和Mariadb(最小3G内存) https://www.sonarqube.org/downloads/ #:安装文档 h ...

  7. SpringMVC详细实例

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...

  8. Linux:ps -ef命令

    ps命令将某个进程显示出来 grep命令是查找 中间的|是管道命令 是指ps命令与grep同时执行 PS是LINUX下最常用的也是非常强大的进程查看命令 检查java 进程是否存在:ps -ef |g ...

  9. Spring Boot简单操作

    目录 一.自定义异常页面 二.单元测试 ​三.多环境选择 四.读取主配置文件中的属性 五.读取List属性 一.自定义异常页面 对于404.405.500等异常状态,服务器会给出默认的异常页面,而这些 ...

  10. 【Java 8】Stream API

    转自 Java 8 Stream Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进 ...