享元模式及C++实现
享元模式(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++实现的更多相关文章
- Flyweight(享元模式)
import java.util.Hashtable; /** * 享元模式 * @author TMAC-J * 享元模式一般和工厂模式一起使用,但此处为了更好说明,只用享元模式 * 定义:享元模式 ...
- 设计模式(十二)享元模式(Flyweight Pattern)
一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非 ...
- 设计模式--享元模式Flyweight(结构型)
一.享元模式 在一个系统中如果有多个相同的对象,这些对象有部分状态是可以共享的,我们运用共享技术就能有效地支持大量细粒度的对象. 二.例子 举个围棋的例子,围棋的棋盘共有361格,即可放361个棋子. ...
- java享元模式(flyweight)
有个问题: Integer i1 = 12; Integer i2 = 12; System.out.println(i1 == i2);//输出true Integer i1 = 130; Inte ...
- 享元模式 - Flyweight
Flyweight(享元模式) 定义 GOF:运用共享技术有效地支持大量细粒度的对象. GOF的定义比较专业化,通俗来说,当你有大量相似的实例时,你把其中相同的实例取出来共享. 例子 在你的游戏场景中 ...
- C#设计模式-享元模式
在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然 ...
- C#设计模式系列:享元模式(Flyweight)
当频繁地从数据源读取数据时,读出的内容存在重复,那么需要使用享元模式(Flyweight)来提高内存效率,Flyweight模式将节省更多空间,共享的Flyweight越多,空间节省越大. 1.享元模 ...
- javascript - 享元模式
享元模式笔记 运用共享技术有效的支持大量的细粒度对象,避免对象间拥有相同内容造成多余的开销 享元模式主要还是对其数据.方法共享分离,它将数据和方法分成内部数据.内部方法和外部数据.外部方法. 内 ...
- 设计模式C#实现(十三)——享元模式(蝇量模式)
意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 运用共享技术有效地支持大量细粒度的对象. 适用性 当以下情况都成立时使用: 一个程序使用了大量的对象 完全由于使用大量对象造成很大存 ...
- 享元模式/Flyweight模式/对象结构型/设计模式
flyweight 享元模式(对象结构型) Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意 ...
随机推荐
- 1121 if条件语句练习--输入年月日判断执行
<script type="text/javascript"> var a=prompt("请输入一个年","请输入年份"); ...
- podspec文件介绍
podspec文件是cocopods引入的第三方代码库的配置索引文件 它的创建命令是:$pod spec create TestFile podspec文件的常用配置字段介绍 Pod::Spec.ne ...
- FIR.im Weekly - 让炫酷 UI 为 APP 增色
上周我看到一些不错的设计分享,挑选了几个比较全的 GitHub 资源推荐给大家.此外,还精选了一些实用的 iOS,Android 干货文章. iOS 炫酷动画资源 @荧星诉语 收集整理了主流炫酷动画框 ...
- ASSIC码对照表
编码对应字符: ✔:\u2714✘:\u2718 <script type="text/javascript"> var aaa = "\u2718" ...
- Distributed Result Grouping Caveats
Distributed Result Grouping Caveats Grouping is supported distributed searches, with some caveats: 1 ...
- 【转载】UEditor前端配置项说明
UEditor 的配置项分为两类:前端配置项 和 后端配置项 后端配置项具体看这个文档L:后端配置项说明 本文档介绍如何通过设置前端配置项,定制编辑器的特性,配置方法主要通过修改ueditor.con ...
- Markdown学习语法的记录
标题示例 === 标题示例 ---- #标题示例 ##标题示例 ###标题示例 >引用示例 >>引用示例 >>> 引用示例 _斜体示例_ *斜体示例* __粗体示例 ...
- SVM实现多分类的三种方案
SVM本身是一个二值分类器 SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器. 目前,构造SVM多类分类器的方法主要有两类 (1)直接法,直接在目标函数上进行修改,将 ...
- asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件
public class BasePage:Page protected override void OnPreLoad(EventArgs e){ base.OnPreLoad(e); ...
- embarcadero radstudio xe5 正式版 下载地址
http://altd.embarcadero.com/download/radstudio/xe5/delphicbuilder_xe5_win.iso