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

参考文章:

  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. Break up CF700C

    Break up CF700C 首先考虑只能删一条边的做法,我们可以找出所有的桥,然后随便跑一条 S 到 T 路径,如果这条路径上有桥就说明可以,否则不行 发现这个做法其实是 O(M) 的 那么可以先 ...

  2. jQuery添加html绑定事件

    jQuery添加html绑定事件 $("#xxx").on("click",".dev",function(){ });

  3. linux sort 命令详解(转载)

    转载:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html#3374576 sort是在Linux里非常常用的一个命令,管排序的 ...

  4. 【翻译】.NET 6 中的 dotnet monitor

    原文:Announcing dotnet monitor in .NET 6 我们在 2020 年 6 月首次推出了dotnet monitor 作为实验工具,并在去年(2020年)努力将其转变为生产 ...

  5. LeetCode 从头到尾打印链表

    LeetCode 从头到尾打印链表 题目描述 输入一个链表头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 一得之见(Jav ...

  6. A Child's History of England.27

    Then, the Red King went over to Normandy, where the people suffered greatly under the loose rule of ...

  7. day13 cookie与session和中间件

    day13 cookie与session和中间件 今日内容概要 cookie与session简介 django操作cookie与session django中间件简介 如何自定义中间件 csrf跨站请 ...

  8. day12 keepalived高可用

    day12 keepalived高可用 一.高可用介绍 1.什么是高可用 部署在整个集群中的一个高可用软件,作用是创建一个VIP(虚拟IP),在整个集群中有且只有一个机器上生成VIP,当这台机器出现问 ...

  9. 26. Linux GIT

    windows git 下载链接: Msysgit   https://git-scm.com/download/win 1 进入git bash进行第一次配置 git config --global ...

  10. Spark的shuffle和MapReduce的shuffle对比

    目录 MapperReduce的shuffle Spark的shuffle 总结 MapperReduce的shuffle shuffle阶段划分 Map阶段和Reduce阶段 任务 MapTask和 ...