享元模式

来源:互联网 发布: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
原创粉丝点击