设计模式之享元模式

来源:互联网 发布:程序员一天工作几小时 编辑:程序博客网 时间:2024/05/21 03:20

设计模式之享元模式

定义:运用共享技术有效的支持大量细粒度的对象

顾名思义吧,看到享,我们就想到共享,对的,这个模式就是共享,我们可以举个例子来说吧

假如有一天,小张同学需要我们帮他做一个学生信息管理系统,我们开始很认真的做了,过了几天,小王同学也需要我们帮它做一个学生信息管理系统,我们可以直接把之前做的稍微改一点东西给他,其中大部分东西都是可以共享的

我们把这些不会随着环境改变而改变的共享部分称为是享元对象的内部状态

而随着环境的改变而改变的,不可以共享的状态就是外部状态了

那么我们可以分析一下上面的例子

#include<iostream>#include<string>#include<map>using namespace std;class User{private:string name;public:User(string name){this->name = name;}string getName(){return name;}};//抽象的管理系统class System{private:public:virtual void Use(User* usr) = 0;};//具体的管理系统class ConcreteSystem:public System{private:string name;public:ConcreteSystem(string name){this->name = name;}void Use(User* usr){cout << "系统分类:" << this->name << endl << "用户分类:" << usr->getName() << endl;}};//管理系统工厂类,用来创建并管理System对象,当用户需要具体的管理系统的时候,它提供一个已创建的实例或者//重新创建一个class SystemFactory{private:map<string, System*> m;public:System* GetSystem(string key){auto i = m.find(key);if (i == m.end()){System* sys = new ConcreteSystem(key);m.insert(pair<string, System*>(key, sys));}cout << "123" << endl;return m[key];}};int main(void){//我们找系统是在工厂里找,如果工厂有就直接用//先建立一个工厂SystemFactory* factory = new SystemFactory();System* sys1 = factory->GetSystem("学生信息管理系统");sys1->Use(new User("张三"));System* sys2 = factory->GetSystem("学生信息管理系统");sys2->Use(new User("李四"));System* sys3 = factory->GetSystem("教师信息管理系统");sys3->Use(new User("王五"));delete factory;factory = NULL;delete sys1;sys1 = NULL;delete sys3;sys3 = NULL;return 0;}
享元模式可以避免大量非常相似类的实例的开销,在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些
实例除了几个参数外基本上都是相同的,有时就能够受大幅度的减少需要实例化的类的数量。如果能把哪些参数移动到类实例的
外面,将方法调用的时候将他们传递进来,就可以通过共享大幅度的减少单个实例的数目

适用情况

1、一个应用程序使用了大量的对象的时候

2、由于使用大量的对象造成了比较巨大的存储开销时

3、对象的很多状态都可以改变为外部状态时

4、使用外部状态后可以用较少的对象取代大量的对象

下来我们看一看享元模式的具体类图和代码



代码:

//具体享元类的父类class FlyWeight{public:virtual void Operation(int key) = 0;};//用于共享的类class ConcreteFlyWeight :public FlyWeight{public:void Operation(int key){cout << "具体FlyWeight:" << key << endl;}};//不能共享的类class UnsharedConcreteFlyWeight :public FlyWeight{public:void Operation(int key){cout << "不共享的具体FlyWeight:" << key << endl;}};class FlyWeightFactory{private:map<int, FlyWeight*> m;public:FlyWeight* getFlyWeight(int key){if (m[key] == NULL){FlyWeight* fly = new ConcreteFlyWeight();}return m[key];}};int main(void){FlyWeightFactory* factory = new FlyWeightFactory();FlyWeight* fly = factory->getFlyWeight(20);fly->Operation(20);FlyWeight* fly1 = new UnsharedConcreteFlyWeight();fly1->Operation(50);delete factory;factory = NULL;delete fly;fly = NULL;delete fly1;fly1 = NULL;return 0;}


原创粉丝点击