享元模式(flyweight)

flyweight是轻量级的意思,中文这边翻译成享元,更容易让人理解一些。

享元模式是为了应对大量细粒度对象重复的问题。程序中存在大量细粒度的对象,每次要使用时都必须创建一个新的对象,既影响了运行效率又增加了内存消耗。于是有了享元模式,享元模式提取出这些细粒度对象中间公共的状态(属性,我的理解),只生成一个实例对象,所有用到这些公共属性对象的地方,都指向这一个实例。

根据我的理解,很多类有一部分的属性是可以共享的,而不可共享的部分需要提取出来,通过参数传递来使用。

典型的享元模式的例子为文书处理器中以图形结构来表示字符。一个做法是,每个字形有其字型外观,字模metrics,和其他格式资讯,但为每个字符都生成这些书写,就会额外消耗许多的内存空间。取而代之的是,每个字符参照一个共享字形物件,此物件会被其他有共同特质的字符所分享;只有每个字符的位置才需要另外存储。[摘自 维基百科-享元模式]

文书处理器是最普遍的用来说明享元模式的例子。从这个例子就能看到哪些是可以被共享的,哪些是不能被共享的,通过这种方式达到提高系统效率和减小内存消耗的目的。

从下图看出,ConcreteFlyWeight就是可以共享的部分,通过工厂模式的方式来选择共享的实例,客户端就可以直接使用了。

我感觉就有点像简单工厂模式,区别是不像工厂模式一样每次都生成一个不同的对象实例,而是返回一个现成的对象实例。

暂时就只理解了这么多,其他的需要在实践中慢慢的总结。

常用场景

1.当系统中有大量的细粒度对象实例,而且这些对象实例中有一些属性是重复的情况下,考虑使用。

文本编辑器,输入法之类的常用应用。

优点

1.提高了系统的效率,减小了内存的消耗。

2.减少了重复代码。

3.减少了系统的复杂度。

缺点

1.维护共享对象和查找所需的共享对象需要花费很多时间。

C++实现

 #ifndef _FLYWEIGHT_H_
#define _FLYWEIGHT_H_ class FlyWeight
{
public:
FlyWeight(){};
virtual ~FlyWeight(){}; virtual void operation() = ; }; class ConcreteFlyWeight: public FlyWeight
{
public:
ConcreteFlyWeight(){};
~ConcreteFlyWeight(){}; void operation(); }; #endif

FlyWeight.h

 #include "FlyWeight.h"
#include <stdio.h> void ConcreteFlyWeight::operation()
{
printf("I'm ConcreteFlyWeight!\n");
}

FlyWeight.cpp

 #ifndef _FLYWEIGHT_FACTORY_H_
#define _FLYWEIGHT_FACTORY_H_ #include <vector>
#include "FlyWeight.h" using namespace std; class FlyWeightFactory
{
public:
FlyWeightFactory();
~FlyWeightFactory(); FlyWeight* GetFlyWeight(int key); private:
vector<FlyWeight*> m_flyWeights;//很多时候为了增加效率,使用hash表之类的结构,这里简单的使用vector
}; #endif

FlyWeightFactory.h

 #include "FlyWeightFactory.h"

 FlyWeightFactory::FlyWeightFactory()
{
FlyWeight* tmp = new ConcreteFlyWeight();
m_flyWeights.push_back(tmp);
} FlyWeightFactory::~FlyWeightFactory()
{
FlyWeight* tmp = m_flyWeights.at();
delete tmp;
tmp = NULL;
} FlyWeight* FlyWeightFactory::GetFlyWeight(int key)
{
//简单点表示
return m_flyWeights.at(key);
}

FlyWeightFactory.cpp

 #include "FlyWeightFactory.h"

 int main()
{
FlyWeightFactory* factory = new FlyWeightFactory(); FlyWeight* flyWeight = factory->GetFlyWeight();
flyWeight->operation();
return ;
}

client.cpp

g++ -o client client.cpp FlyWeight.cpp FlyWeightFactory.cpp

运行结果

享元模式及C++实现的更多相关文章

  1. Flyweight(享元模式)

    import java.util.Hashtable; /** * 享元模式 * @author TMAC-J * 享元模式一般和工厂模式一起使用,但此处为了更好说明,只用享元模式 * 定义:享元模式 ...

  2. 设计模式(十二)享元模式(Flyweight Pattern)

    一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非 ...

  3. 设计模式--享元模式Flyweight(结构型)

    一.享元模式 在一个系统中如果有多个相同的对象,这些对象有部分状态是可以共享的,我们运用共享技术就能有效地支持大量细粒度的对象. 二.例子 举个围棋的例子,围棋的棋盘共有361格,即可放361个棋子. ...

  4. java享元模式(flyweight)

    有个问题: Integer i1 = 12; Integer i2 = 12; System.out.println(i1 == i2);//输出true Integer i1 = 130; Inte ...

  5. 享元模式 - Flyweight

    Flyweight(享元模式) 定义 GOF:运用共享技术有效地支持大量细粒度的对象. GOF的定义比较专业化,通俗来说,当你有大量相似的实例时,你把其中相同的实例取出来共享. 例子 在你的游戏场景中 ...

  6. C#设计模式-享元模式

    在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然 ...

  7. C#设计模式系列:享元模式(Flyweight)

    当频繁地从数据源读取数据时,读出的内容存在重复,那么需要使用享元模式(Flyweight)来提高内存效率,Flyweight模式将节省更多空间,共享的Flyweight越多,空间节省越大. 1.享元模 ...

  8. javascript - 享元模式

    享元模式笔记  运用共享技术有效的支持大量的细粒度对象,避免对象间拥有相同内容造成多余的开销  享元模式主要还是对其数据.方法共享分离,它将数据和方法分成内部数据.内部方法和外部数据.外部方法.  内 ...

  9. 设计模式C#实现(十三)——享元模式(蝇量模式)

    意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 运用共享技术有效地支持大量细粒度的对象. 适用性 当以下情况都成立时使用: 一个程序使用了大量的对象 完全由于使用大量对象造成很大存 ...

  10. 享元模式/Flyweight模式/对象结构型/设计模式

    flyweight 享元模式(对象结构型) Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意 ...

随机推荐

  1. 1121 if条件语句练习--输入年月日判断执行

    <script type="text/javascript"> var a=prompt("请输入一个年","请输入年份"); ...

  2. podspec文件介绍

    podspec文件是cocopods引入的第三方代码库的配置索引文件 它的创建命令是:$pod spec create TestFile podspec文件的常用配置字段介绍 Pod::Spec.ne ...

  3. FIR.im Weekly - 让炫酷 UI 为 APP 增色

    上周我看到一些不错的设计分享,挑选了几个比较全的 GitHub 资源推荐给大家.此外,还精选了一些实用的 iOS,Android 干货文章. iOS 炫酷动画资源 @荧星诉语 收集整理了主流炫酷动画框 ...

  4. ASSIC码对照表

    编码对应字符: ✔:\u2714✘:\u2718 <script type="text/javascript"> var aaa = "\u2718" ...

  5. Distributed Result Grouping Caveats

    Distributed Result Grouping Caveats Grouping is supported distributed searches, with some caveats: 1 ...

  6. 【转载】UEditor前端配置项说明

    UEditor 的配置项分为两类:前端配置项 和 后端配置项 后端配置项具体看这个文档L:后端配置项说明 本文档介绍如何通过设置前端配置项,定制编辑器的特性,配置方法主要通过修改ueditor.con ...

  7. Markdown学习语法的记录

    标题示例 === 标题示例 ---- #标题示例 ##标题示例 ###标题示例 >引用示例 >>引用示例 >>> 引用示例 _斜体示例_ *斜体示例* __粗体示例 ...

  8. SVM实现多分类的三种方案

    SVM本身是一个二值分类器 SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器. 目前,构造SVM多类分类器的方法主要有两类 (1)直接法,直接在目标函数上进行修改,将 ...

  9. asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件

    public class BasePage:Page protected override void OnPreLoad(EventArgs e){     base.OnPreLoad(e);    ...

  10. embarcadero radstudio xe5 正式版 下载地址

    http://altd.embarcadero.com/download/radstudio/xe5/delphicbuilder_xe5_win.iso