享元模式
来源:互联网 发布:arm linux gnu gcc 编辑:程序博客网 时间:2024/06/05 07:24
定义
享元模式(FlyweightPattern)运用共享技术有效地支持大量细粒度的对象。
享元模式通用类图
Flyweight——抽象享元角色
就是一个产品的抽象类,同事定义出对象的外部状态和内部状态的接口或实现。
ConcreteFlyweight——具体享元角色
具体的一个产品类,实现抽象角色定义的业务。该角色中需要注意的是内部状态处理应该与环境无关,不应该出现一个操作改变了内部状态,同时修改了外部状态,这是绝对不允许的。
unsharedConcreteFlyweight——不可共享的享元角色
不存在外部状态或者安全要求(如线程安全)不能够使用共享技术的对象,该对象一般不会出现在享元工厂中。
FlyweightFactory——享元工厂
职责非常简单,就是构造一个池容器,同事提供从池中获得对象的方法。
享元模式的优点和缺点
享元模式是一个非常简单的模式,它可以大大减少应用程序创建的对象,降低程序内存的占用,增强程序的性能,但它同时也提高了系统复杂性,需要分离出外部状态和内部状态,而且外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱。
通用源代码
#include <iostream>#include <string>#include <map>using namespace std;class Flyweight //抽象享元角色{protected: string intrinsic; //内部状态public: Flyweight(string intri):intrinsic(intri){}; virtual void Operation(int extrinsicState)=0; //extrinsicState 为外部状态};class ConcreteFlyweight:public Flyweight{ //具体享元角色public: ConcreteFlyweight(string intri):Flyweight(intri){}; void Operation(int extrinsicState) { cout<<"具体享元对象:"<<'\n' <<"\t内部状态:"<<intrinsic<<'\n' <<"\t外部状态:"<<extrinsicState<<endl; }};class unshareConcreteFlyweight:public Flyweight{public: unshareConcreteFlyweight(string intri):Flyweight(intri){}; void Operation(int extrinsicState) { cout<<"不共享的具体享元对象:"<<'\n' <<"\t内部状态:"<<intrinsic<<'\n' <<"\t外部状态:"<<extrinsicState<<endl; }};class FlyweightFactory{private: map<string,Flyweight *> flyweights;public: FlyweightFactory() { flyweights.insert(make_pair("X",new ConcreteFlyweight("X"))); flyweights.insert(make_pair("Y",new ConcreteFlyweight("Y"))); flyweights.insert(make_pair("Z",new ConcreteFlyweight("Z"))); } Flyweight *getFlyweight(string key) { map<string,Flyweight *>::iterator iter = flyweights.find(key); if(iter != flyweights.end()) return iter->second; else return NULL; }};int main(){ int extrinsicState = 22; FlyweightFactory f; Flyweight *fw = f.getFlyweight("X"); fw->Operation(--extrinsicState); fw = f.getFlyweight("Y"); fw->Operation(--extrinsicState); fw = f.getFlyweight("Z"); fw->Operation(--extrinsicState); unshareConcreteFlyweight uf("UF"); uf.Operation(--extrinsicState); return 0;}
运行结果:
0 0
- 深入浅出享元模式
- 享元模式
- 享元(FlyWeight)模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式Flyweight
- 享元模式
- 享元模式
- 享元模式
- FlyWeight 享元模式
- 享元模式(Flyweight)
- 享元模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式 ---flyweight
- 领悟-ajax
- Leveldb 实现原理
- 并查集(Union -Find)应用举例--基础篇
- vim配置
- 用友支持服务 从幕后走向前台
- 享元模式
- HDU4336-Card Collector(概率DP求期望)
- [leetcode]Multiply Strings
- Excel 已经检测到"xxx.xsl"是SYLK文件,但是不能将其加载解决方法
- JVM资料汇总
- H264实时编码及NALU,RTP传输(续)
- memset()函数详解
- CSS执行顺序与优先权
- 带模板的顺序循环队列