/*
享元模式:通过与其他类共享部分元素减小内存的使用
抽象元素  + 具体元素   共享工厂
享元模式的特点是,复用我们内存中已存在的对象,降低系统创建对象实例
共享对象的内部状态,至于外部状态可以提供接口来和内部数据进行对接处理

*/
#include <iostream>
#include <string>
#include <vector>
#include <cassert>
using namespace std;
class FlyWeight
{
public:
virtual ~FlyWeight(){}
virtual void Operation(const string& exState){}
string GetInsState(){ return this->_insState; }
protected:
FlyWeight(string insState) {
this->_insState = insState;
}
private:
string _insState;
};
class ConFlyweight :public FlyWeight
{
public:
ConFlyweight(string insState) :FlyWeight(insState)
{
cout << "ConFlyweight Build " << insState << endl;
}
~ConFlyweight(){};
void Operation(const string& exState)
{
cout << this->GetInsState() << endl;
cout << exState << endl;//在这里对内部和外部状态进行汇合处理
}
}; 
class FlyWeightFactory
{
public:
FlyWeightFactory(){}
~FlyWeightFactory(){}
FlyWeight* GetFlyweight(const string& key)
{
vector<FlyWeight*>::iterator it = _fly.begin();
for (; it != _fly.end(); it++)
{
if ((*it)->GetInsState() == key)
{
cout << "Have Created" << endl;
return *it;
}
}
FlyWeight* fn = new ConFlyweight(key);
_fly.push_back(fn);
return fn;
}
private:
vector<FlyWeight*> _fly;
};
void main_12()
{
FlyWeightFactory *fw = new FlyWeightFactory();
FlyWeight* fw1 = fw->GetFlyweight("Jackill");
FlyWeight* fw2 = fw->GetFlyweight("Rukawa");
FlyWeight* fw3 = fw->GetFlyweight("Jackill");
system("pause");

}

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,
由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意
义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.举例说明什么是一对一的数据映射。比如一个班级中,每个
学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map可能轻易描述,很明显学号用int描述,姓名用字符串描述
1.数据的插入
在构造map容器后,我们就可以往里面插入数据了。这里讲三种插入数据的方法:
第一种:用insert函数插入pair数据,
mapStudent.insert(pair<int, string>(1, “student_one”));
第二种:用insert函数插入value_type数据,举例
mapStudent.insert(map<int, string>::value_type (1, “student_one”));
第三种:用数组方式插入数据,举例
mapStudent[1] =  “student_one”;
mapStudent[2] =  “student_two”;
用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的,
但是用数组方式就不同了,它可以覆盖以前该关键字对应的值,
mapStudent.insert(map<int, string>::value_type (1,“student_one”));
上面这两条语句执行后,map中1这个关键字对应的值是“student_one”,第二条语句并没有生效,那么这就涉及到我
们怎么知道insert语句是否插入成功的问题了,可以用pair来获得是否插入成功: Pair<map<int, string>::iterator, bool> Insert_Pair;
Insert_Pair = mapStudent.insert(map<int, string>::value_type (1, “student_one”));
我们通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话
Insert_Pair.second应该是true的,否则为false。大家可以用如下程序,看下用数组插入在数据覆盖上的效果
2.map的大小
在往map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下:
Int nSize = mapStudent.size();
3.数据的遍历
这里也提供三种方法,对map进行遍历
map<int, string>::reverse_iterator  iter;
for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)
{ Cout<<iter->first<<”   ”<<iter->second<<end;}
4.数据的查找(包括判定这个关键字是否在map中出现)
在这里我们将体会,map在数据插入时保证有序的好处。
要判定一个数据(关键字)是否在map中出现的方法比较多,这里标题虽然是数据的查找,在这里将穿插着大量的
map基本用法。
这里给出三种数据查找方法
第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,
要么是0,要么是1,出现的情况,当然是返回1了
第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,
第三种:这个方法用来判定数据是否出现,是显得笨了点,但是,我打算在这里讲解
Lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)
Upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)

设计模式---享元模式(C++实现)相关推荐

  1. Python设计模式-享元模式

    Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...

  2. 10-Python与设计模式--享元模式

    10-Python与设计模式--享元模式 一.网上咖啡选购平台 假设有一个网上咖啡选购平台,客户可以在该平台上下订单订购咖啡,平台会根据用户位置进行线下配送.假设其咖啡对象构造如下: class Co ...

  3. 设计模式--享元模式实现C++

    /********************************* *设计模式--享元模式实现 *C++语言 *Author:WangYong *Blog:http://www.cnblogs.co ...

  4. 【设计模式】Java设计模式 - 享元模式

    [设计模式]Java设计模式 - 享元模式

  5. Unity设计模式——享元模式(附代码)

    Unity设计模式--享元模式(附源码) 享元Flyweight模式是什么 享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的 ...

  6. 第二十二章 Caché 设计模式 享元模式

    文章目录 第二十二章 Caché 设计模式 享元模式 定义 优点 使用场景 结构图 描述 完整示例 实体类 抽象享元角色 实现享元角色 享元工厂 调用 思考 第二十二章 Caché 设计模式 享元模式 ...

  7. JavaScript设计模式-享元模式

    JavaScript设计模式-享元模式 概念 例子 内部状态与外部状态 享元模式的通用结构 例子 总结 github仓库地址:点击 [设计模式例子](https://github.com/fanhua ...

  8. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构 图-享元模式结构图 Flyweight : 它是所有具体享元类的超类或接口,通过这个 ...

  9. java设计模式---享元模式

    Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己 对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自己的 ...

  10. PHP设计模式——享元模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 享元模式使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使用无法令人接受的大量内存的 ...

最新文章

  1. 数据仓库数据模型之:极限存储--历史拉链表
  2. python求pai的近似值_Python实现蒙特卡洛模拟(第1部分)【个人翻译自Medium】
  3. 理性预期学派(Rational Expectation School)
  4. 【数据结构与算法】之深入解析“复原IP地址”的求解思路与算法示例
  5. 【Java线程】互斥 同步 异步 并发 多线程的区别与联系
  6. java实现二分查找-两种方式
  7. 《深入浅出nodejs》读书笔记(3)
  8. 玩物得志Java笔试题_代码规范利器-CheckStyle
  9. 小学计算机课评课用语,信息技术评课心得
  10. 求解集合A与B的差集
  11. 4.1 Spark SQL概述
  12. 单源最短路(spfa+Dijkstra)附数据
  13. Flutter CircularProgressIndicator圆形进度指示器
  14. 1_Qt的介绍和开始
  15. amplifer 项目_文章详细信息
  16. 汽车控制系统matlab,汽车控制系统建模与仿真(肖仁鑫)-中国大学mooc-题库零氪
  17. wind客户端python接口 java调用
  18. 【量化课堂】海龟策略
  19. HTML文件转JSP文件
  20. Python爬虫 之数据解析之bs4

热门文章

  1. 7-10 数组循环左移 (20 分)
  2. 聚会「AHOI 2008」
  3. [技术博客]使用wx.downloadfile将图片下载到本地临时存储
  4. bzoj4006 [JLOI2015]管道连接
  5. css中的.clearfix是什么意思?
  6. zookeeper 事务日志
  7. 《跟我一起做J2EE版Blog–jPress》6(Spring集成Struts2,打通第一个Action)
  8. 802.1W RSTP
  9. 华为/华三:OSPF多区域配置
  10. Security+ 学习笔记23 帐户管理