设计模式之享元模式
来源:互联网 发布: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;}
阅读全文
0 0
- 设计模式之享元
- 设计模式之享元
- 设计模式 之 享元
- 设计模式之享元
- 设计模式之享元
- 设计模式之Flyweight享元模式
- 设计模式之享元模式
- 设计模式之享元模式
- 设计模式之享元模式
- 设计模式之享元模式
- 设计模式之享元模式
- 设计模式之享元模式
- java设计模式之享元模式
- 【设计模式】之 Flyweight享元模式
- 设计模式之享元模式
- c++设计模式之享元模式
- 设计模式之享元模式
- 设计模式之享元模式
- 机器学习笔记十九:正则化思想
- 杨辉三角
- 自动扫描工具:Metasploit's Wmap
- angular/vue/react优劣性对比分析
- Java 7之基础
- 设计模式之享元模式
- 硬件工程师不会底层合适吗
- AS的签名打包
- MySQL数据库JDBC2.0操作
- Vue中引入Countly,'Countly' is not defined
- PDF编辑技巧之添加页码和编辑文字
- Python
- MATLAB 在数学建模中的应用
- CentOS 7 开放防火墙端口命令