首页 > 代码库 > 享元模式
享元模式
一、简介
1、享元模式运用共享技术有效地支持大量细粒度的对象。
2、享元模式是为了减少同种类的实例化,以达到节省内存的目的。
3、类成员函数
抽象享元类(Flyweight)
它是所有具体享元类的超类。为这些类规定出需要实现的公共接口,那些需要外蕴状态(Exte的操作可以通过方法的参数传入。抽象享元的接口使得享元变得可能,但是并不强制子类实行共享,因此并非所有的享元对象都是可以共享的。
具体享元类(ConcreteFlyweight)
具体享元类实现了抽象享元类所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。有时候具体享元类又称为单纯具体享元类,因为复合享元类是由单纯具体享元角色通过复合而成的。
不能共享的具体享元类(UnsharableFlyweight)
不能共享的享元类,又叫做复合享元类。一个复合享元对象是由多个单享元对象组成,这些组成的对象是可以共享的,但是复合享元类本身并不能共享。
享元工厂类(FlyweightFactoiy)
享元工厂类负责创建和管理享元对象。当一个客户端对象请求一个享元对象的时候,享元工厂需要检查系统中是否已经有一个符合要求的享元对象,如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有适当的享元对象的话,享元工厂角色就应当创建一个新的合适的享元对象。
二、C++程序
1 // 享元模式.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include<string> 7 #include<map> 8 using namespace std; 9 class Website10 {11 public:12 Website(){}13 virtual ~Website(){}14 virtual void show()=0;15 };16 class Concretewebsite :public Website17 {18 private:19 string name;20 public:21 Concretewebsite(string n):name(n){}22 virtual ~Concretewebsite(){}23 virtual void show()24 {25 cout<<name<<endl;26 }27 };28 class Websitefactory29 {30 private:31 //创建一个map,类似于哈希表,这里也可以用哈希表32 map<string,Concretewebsite *> websites;33 public:34 Websitefactory(){}35 ~Websitefactory(){}36 //获得网站,如果该类型的网站已经被创建过,则返回已经创建的网站,否则新创建一个37 Concretewebsite* getwebsite(string key)38 {39 if(websites[key]==NULL)40 {41 websites[key]=new Concretewebsite(key);42 }43 return websites[key];44 }45 //返回实际创建网站的个数,即hash表中元素的个数46 int cout()47 {48 return websites.size();49 }50 };51 int _tmain(int argc, _TCHAR* argv[])52 {53 Websitefactory* websitefactory=new Websitefactory();54 Concretewebsite * weixin1=websitefactory->getwebsite("微信营销");55 weixin1->show();56 57 Concretewebsite * weixin2=websitefactory->getwebsite("微信营销");58 weixin2->show();59 60 Concretewebsite * weibo1=websitefactory->getwebsite("微博营销");61 weibo1->show();62 63 cout<<websitefactory->cout()<<endl;64 return 0;65 }
程序中使用了,三个营销,但是有只有两个种类,使用享元模式只实例化两个对象
享元模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。