设计模式学习--享元模式
2017-03-20 22:30
169 查看
享元模式,运用共享技术有效的支持大量细粒度的对象。
享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。
如果一个应用程序使用了大量的对象。而大量的这些对象造成了很大的存储开销是就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较小的共享对象取代很多组对象,此时可以考虑使用享元模式。
书中是用c#和Hashtable写的,我将之用c++和map改了一下。
显示结果:
[hjf@hjf 设计模式]$ ./a.out
网站分类:产品展示
网站分类:产品展示
网站分类:博客
网站分类:博客
网站分类总数:2
享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。
如果一个应用程序使用了大量的对象。而大量的这些对象造成了很大的存储开销是就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较小的共享对象取代很多组对象,此时可以考虑使用享元模式。
书中是用c#和Hashtable写的,我将之用c++和map改了一下。
#include <iostream> #include <map> using namespace std; class Website //网站抽象类 { public: virtual void use() = 0; //网站具体分类纯虚函数 }; class RealWebsite : public Website //具体网站 { string m_name; public: RealWebsite(string name):m_name(name){}; //传入网站类型名称 void use() //网站具体分类 { cout<<"网站分类:"<<m_name<<endl; } }; class WebsiteFactory //网站生成工厂 { map<string, RealWebsite*> m_web; //map用于存放分类名和具体的对象指针 map<string, RealWebsite*>::iterator it; //map的迭代器 public: RealWebsite* getwebsite(string key) //输入分类名获取对应的对象指针 { it = m_web.find(key); //map中寻找key if(it == m_web.end()) //map中没有key { m_web.insert(pair<string, RealWebsite*>(key, (new RealWebsite(key)))); //map中插入key和新建的对象 it = m_web.find(key); //再次寻找key return it->second; //返回刚创建的对象指针 } else { return it->second; //map中已存在key 返回对应的对象指针 } } int getcount() //获取总的网站分类数目 { return m_web.size(); } }; int main() { WebsiteFactory* factory = new WebsiteFactory(); //创建网站工厂实例 Website* fx = factory->getwebsite("产品展示"); //获取产品展示的实例 fx->use(); //打印 Websit 4000 e* fy = factory->getwebsite("产品展示"); //获取产品展示的实例 fy->use(); //打印 Website* fa = factory->getwebsite("博客"); //获取博客的实例 fa->use(); //打印 Website* fb = factory->getwebsite("博客"); //获取博客的实例 fb->use(); //打印 cout<<"网站分类总数:"<<factory->getcount()<<endl; //打印分类数量 return 0; }
显示结果:
[hjf@hjf 设计模式]$ ./a.out
网站分类:产品展示
网站分类:产品展示
网站分类:博客
网站分类:博客
网站分类总数:2
相关文章推荐
- 设计模式学习笔记(十二)——Flyweight享元模式
- 设计模式学习笔记(十二)——Flyweight享元模式
- 设计模式学习笔记——享元模式
- 学习设计模式第十四 - 享元模式
- HeadFirst 设计模式学习笔记16--享元模式拾零
- 享元模式 - 设计模式学习
- 跟屌丝大哥学习设计模式--享元模式
- 基于设计模式的学习之旅-----享元模式(附源码)
- 设计模式学习-----享元模式
- 【HeadFirst 设计模式学习笔记】15 享元模式拾零
- 设计模式学习笔记——享元模式
- 设计模式学习8 -- Flyweight(享元模式)
- 设计模式学习笔记(十二)——Flyweight享元模式
- 设计模式学习笔记--Flyweight享元模式
- 设计模式学习笔记(十二)——Flyweight享元模式
- 设计模式学习笔记(十二)——Flyweight享元模式
- 设计模式学习笔记-享元模式
- 设计模式学习笔记之Flyweight模式(享元模式)
- 设计模式学习笔记——享元模式
- 设计模式学习笔记——享元模式