18享元模式



1享元模式的核心内容是(对下面代码的总结):

A:一个网站的抽象类

B:一个用于实例化网站的类

C:由一个工厂类维护网站的创建,并将站点管理存储到Map中

2享元模式的作用:统一管理站点的创建。

3享元模式具体描述

享元模式:FLYWEIGHT在拳击比赛中指最轻量级。

享元模式以共享的方式高效的支持大量的细粒度对象。

享元模式能做到共享的关键是区分内蕴状态和外蕴状态。

内蕴状态存储在享元内部,不会随环境的改变而有所不同。

外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,

它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,

将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,

而应当使用一个工厂对象负责创建被共享的对象。

享元模式大幅度的降低内存中对象的数量。

 

每天跟MM发短信,手指都累死了,最近买了个新手机,

可以把一些常用的句子存在手机里,要用的时候,直接拿出来

在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。

共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,

根据上下文情况使用。

4享元模式类图

5.代码:

#include
<iostream>

#include
<list>

#include
<string>

#include
<map>

using
namespace
std;

 

//享元模式:FLYWEIGHT在拳击比赛中指最轻量级。

//享元模式以共享的方式高效的支持大量的细粒度对象。

//享元模式能做到共享的关键是区分内蕴状态和外蕴状态。

//内蕴状态存储在享元内部,不会随环境的改变而有所不同。

//外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,

//它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,

//将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,

//而应当使用一个工厂对象负责创建被共享的对象。

//享元模式大幅度的降低内存中对象的数量。

//

//每天跟MM发短信,手指都累死了,最近买了个新手机,

//可以把一些常用的句子存在手机里,要用的时候,直接拿出来

//,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。

//共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,

//根据上下文情况使用。

 

//网站的抽象函数

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:

   
//通过Key Value的方式存储网站

   
map<string,
WebSite*>
wf;

public:

   
//得到某个网站

   
WebSite *getWebSiteCategory(string
key)

   
{

       
if (wf.find(key)
== wf.end())

       
{

           
//通过一个统一的ConcreteWebSite来实例化网站,并将网站名存储起来

           
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();

   

   
//结果为3

   
cout <<
wf->getWebSiteCount()
<< endl;

   
cin.get();

   
return 0;

}

运行结果如下:

时间: 2024-10-03 12:23:09

18享元模式的相关文章

减小内存的占用问题——享元模式和单例模式的对比分析

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!总结的知识点如下: 享元模式概念和实现例子 使用了享元模式的Java API String类 java.lang.Integer 的 valueOf(int)方法源码分析 使用享元模式的条件 享元模式和单例模式的区别 前面的策略模式的话题提起了:如何解决策略类膨胀的问题,说到 "有时候可以通过把依赖于环境Context类的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用."换言之,可以使

JS实现简单的图书馆享元模式实例

  本文实例讲述了JS实现简单的图书馆享元模式.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

第11章 享元模式(Flyweight Pattern)

原文 第11章 享元模式(Flyweight Pattern) 概述:        面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作?享元模式j就可以让我们更好的复用我们内存中已存在的对象,降低系统创建对象实例的性能消耗    运用共享技术有效地支持大量细粒度的对象.[GOF <设计模式>]   结构图:   举例:     为

设计模式之禅之设计模式-享元模式

一:享元模式定义        --->享元模式(Flyweight Pattern)是池技术的重要实现方式        --->使用共享对象可有效地支持大量的细粒度的对象        --->要求细粒度对象,那么不可避免地使得对象数量多且性质相近,那我们就将些对象的信息分为两个部分:内部状态(intrinsic)与外部状态(extrinsic).                ● 内部状态                        内部状态是对象可共享出来的信息,存储在享元对象

【设计模式】—— 享元模式Flyweight

模式意图 享元模式,也叫[轻量级模式]或者[蝇量级模式].主要目的就是为了减少细粒度资源的消耗.比如,一个编辑器用到大量的字母数字和符号,但是不需要每次都创建一个字母对象,只需要把它放到某个地方共享使用,单独记录每次创建的使用上下文就可以了. 再比如餐馆的桌子,餐具,这些都是享元模式的体现.客户是流动的,每次吃饭都是用饭店固定的那些餐具,而饭店也不需要每次新来顾客,就买新的盘子餐具. 应用场景 1 一个系统应用到了大量的对象,而且很多都是重复的. 2 由于大量对象的使用,造成了存储效率上的开销.

php设计模式 FlyWeight (享元模式)

复制代码 代码如下: <?php /** * 享元模式 * * 运用享元技术有效的支持大量细粒度的对象 */ class CD { private $_title = null; private $_artist = null; public function setTitle($title) { $this->_title = $title; } public function getTitle() { return $this->_title; } public function s

DotNet Framework源代码中的模式(九)——Flyweight(享元模式)

运用共享技术有效地支持大量细粒度的对象. 在.Net中处理字符串时,有一个很重要的机制,叫做字符串驻留机制,就是运用了享元模式.CLR(公共语言运行库)通过维护一个表来存放字符串,该表称为拘留池,它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用.因此,具有特定值的字符串的实例在系统中只有一个. CLR中使用享元模式实现字符串驻留的过程:CLR内部维护着一块特殊的数据结构--我们可以把它看成是一个Hash table,这个Hash table维护者大部分创建的string(我这里没有说

重温设计模式(一)——享元模式(Flyweight)

一.世间万物皆为对象 从大学校园中拦住一个软件工程专业的学生,问他,什么是面向对象.他会告诉你,世间万物皆是对象. 世界之大,何止万物.上至宇宙星辰,下至细菌病毒.皆为对象. 女孩,吐气如兰,仍留淡淡余香. 男孩,闭眼陶醉,不亦乐乎. 二.对象爆炸 呼吸之间,分子无数. 每个分子皆为一对象,恐万台服务器之矩阵亦无可容. 奈何乎? GOF 曰:享元模式! 三.何为享元模式 Flyweight : 次最轻量级的拳击选手.即粒度最小. 因此,享元模式的目的是采用共享技术解决大量细粒度对象的爆炸问题.

设计模式学习笔记(二十二)—FlyWeight享元模式

一.FlyWeight模式定义: 运用共享技术有效地支持大量细粒度对象. 二.模式解说 也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象.在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式.Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对象.Flyweight模式是一个提高程序效率和性能的