设计模式-享元模式
2016-07-28 19:01
309 查看
享元模式(Flyweight):
运用共享技术有效地支持大量细粒度的对象。
1.如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。
2.享元模式可以避免大量非常相似类的开销。在程序设计中,有时就能够受到大幅度地减少需要实例化的类的数量。如果能把那些参数转移到类实例的外面,在方法调用时将他们传递进来,就可以通过共享大幅度地减少单个实例的数目。
享元模式实现代码:
执行结果:
运用共享技术有效地支持大量细粒度的对象。
1.如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。
2.享元模式可以避免大量非常相似类的开销。在程序设计中,有时就能够受到大幅度地减少需要实例化的类的数量。如果能把那些参数转移到类实例的外面,在方法调用时将他们传递进来,就可以通过共享大幅度地减少单个实例的数目。
享元模式实现代码:
#pragma once #include <map> #include <string> #include <iostream> using namespace std; //Flyweight类,它是所有具体享元的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态。 class CFlyweight { public: virtual void Operation(int nExtrinsicstate) = 0; }; //CConcreteFlyweight是继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间。 class CConcreteFlyweight : public CFlyweight { public: void Operation(int nExtrinsicstate) { cout<<"ju ti Flyweight:"<<nExtrinsicstate<<endl; } }; //UnsharedConcreteFlyweight是指那些不需要共享的Flyweight子类。因为Flyweight接口共享称为可能, //但它并不强制共享。 class CUnsharedConcreteFlyweight:public CFlyweight { public: void Operation(int nExtrinsicstate) { cout<<"bu gong xiang de ju ti Flyweight:"<<nExtrinsicstate<<endl; } }; //FlyweightFactiry,是一个享元工厂,用来创建并管理Flyweight对象。它主要是用来确保合理地共享 //Flyweight,当用户请求一个Flyweigth时,FlyweightFactory对象提供一个已经创建的实例或者创建一个。 class CFlyweightFactory { private: map<string ,CFlyweight *>m_mpFlyweight; public: CFlyweightFactory() { m_mpFlyweight.clear(); m_mpFlyweight["X"] = new CConcreteFlyweight(); m_mpFlyweight["Y"] = new CConcreteFlyweight(); m_mpFlyweight["Z"] = new CConcreteFlyweight(); } ~CFlyweightFactory() { delete m_mpFlyweight["X"]; delete m_mpFlyweight["Y"]; delete m_mpFlyweight["Z"]; } CFlyweight * GetFlyweight(string strKey) { return m_mpFlyweight[strKey]; } };客户端调用:
#include "stdafx.h" #include <iostream> #include <windows.h> #include "FlyweightMode.h" using namespace std; int main() { int nExtrinsicstate = 22; CFlyweightFactory *pF = new CFlyweightFactory(); CFlyweight *pNowFlyweight = pF->GetFlyweight("X"); pNowFlyweight->Operation(--nExtrinsicstate); pNowFlyweight = pF->GetFlyweight("Y"); pNowFlyweight->Operation(--nExtrinsicstate); pNowFlyweight = pF->GetFlyweight("Z"); pNowFlyweight->Operation(--nExtrinsicstate); CUnsharedConcreteFlyweight *pUF = new CUnsharedConcreteFlyweight(); pUF->Operation(--nExtrinsicstate); delete pUF; delete pF; return 0; }
执行结果:
相关文章推荐
- 感知器,然后就是里面可以给matlab里画出的图按照它产生的顺序编号
- 城市列表的实现
- 快速幂取模
- [iuud8]STL之vector
- localStorage和sessionStorage
- 十分钟理解树状数组
- webView头部加进度加载效果
- Unity-命令模式-UnDo
- http协议(六)报文首部
- POJ 3174 Alignment of the Planets
- HDU 3966 Aragorn's Story
- 函数柯里化
- C++11读书笔记—1(长期历史遗留问题,宏定义与类型)
- HDU 2222 Keywords Search (AC自动机)
- 数组中只出现一次的数字
- Oil Deposits(DFS)
- ProgressDialog简单用法,软件登录、注册时弹出Dialog
- 重写比较器遇到错误参数异常的问题
- 自定义多状态高仿应用下载百分数视图
- java反序化thrift