设计模式之享元模式

来源:互联网 发布:linux查看hba驱动版本 编辑:程序博客网 时间:2024/05/22 00:39

享元模式


1. 享元模式:

运用共享技术有效地支持大量细粒度的对象。

 

享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够大幅度的减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将他们传递进来,就可以通过共享大幅度减少单个实例的数目。

 

什么时候使用该模式?

如果一个应用程序使用了大量对象,而这些对象造成了很大的存储开销,就应该考虑使用;还有就是对象的大多数状态可以是外部状态,也就是不可以共享的状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时考虑享元模式的使用。

2. 享元模式:


Flyweight类,它是所有具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态。

ConcreteFlyweight是继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间。

class Flyweight{public:virtual void operation(int)=0;};class ConcreteFlyweight:public Flyweight{void operation(int extrinsicState){cout<<"具体FlyWeight: "<<extrinsicState<<endl;}};

UnsharedConcreteFlyweight是指那些不需要共享的Flyweight子类,因为Flyweight接口,共享成为可能,但不强制共享。

class UnsharedConcreteFlyweight:public Flyweight{void operation(int extrinsicState){cout<<"不共享的具体FlyWeight: "<<extrinsicState<<endl;}};
FlyweightFactory,是一个享元工厂,用来创建并管理Flyweight对象。主要是用来确保合理的共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个实例。

class FlyweightFactory{private:map<string,Flyweight*> flyweights;public:FlyweightFactory(){flyweights["X"]=new ConcreteFlyweight();flyweights["Y"]=new ConcreteFlyweight();flyweights["Z"]=new ConcreteFlyweight();}Flyweight *getFlyweight(string key){return (Flyweight *)flyweights[key];}};

3. 享元模式的例子:------网站共享代码

#include <iostream>#include <list>#include <string>#include <map>using namespace std;class WebSite//网站抽象类{public:virtual void use()=0;}; //网站具体类class ConcreteWebSite:public WebSite{private:string name;public:ConcreteWebSite(string name){this->name=name;}void use(){cout<<"网站分类: "<<name<<endl;}};//网站工厂类class WebSiteFactory{private:map<string,WebSite*> wf;public: WebSite *getWebSiteCategory(string key){if(wf.find(key)==wf.end()){wf[key]=new ConcreteWebSite(key);}return wf[key];} int getWebSiteCount(){return wf.size();}};int main(){WebSiteFactory *wf=new WebSiteFactory();WebSite *fx=wf->getWebSiteCategory("good");fx->use(); WebSite *fy=wf->getWebSiteCategory("产品展示");fy->use();WebSite *fz=wf->getWebSiteCategory("产品展示");fz->use();WebSite *f1=wf->getWebSiteCategory("博客");f1->use();WebSite *f2=wf->getWebSiteCategory("博客");f2->use();cout<<wf->getWebSiteCount()<<endl;return 0;}






原创粉丝点击