1.意图

运用共享技术有效地支持大量细粒度的对象。

2.动机

Flyweight模式描述了如何共享对象,使得可以细粒度地使用它们,而无需高昂的代价。flyweight是一个共享对象,它可以同时在多个场景(context)中使用,并且在每个场景中flyweight都可以作为一个独立的对象---这一点与非共享对象的实例没有区别。

3.适用性

  • 一个应用程序使用了大量的对象。
  • 完全由于使用大量的对象,造成很大的存储开销。
  • 对象的大多数状态都可变为外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

4.结构图

5.代码实例

//Flyweight.h

#include <string>

class FlweightGraphicBase
{
public:
virtual void PrintColor()=;
protected:
std::string m_Color;
}; class FlweightWhiteGraphic : public FlweightGraphicBase
{
public:
FlweightWhiteGraphic();
void PrintColor();
}; class FlweightBlackGraphic : public FlweightGraphicBase
{
public:
FlweightBlackGraphic();
void PrintColor();
};
//FlyweigtFactory.h

#include <string>
#include <memory>
#include <map> class FlweightGraphicBase; class FlyweightFactory
{
public:
std::shared_ptr<FlweightGraphicBase> GetFlyweight(std::string sColor);
void SetFlyweight(std::string sColor,
std::shared_ptr<FlweightGraphicBase> pFlyweight); private:
std::map <std::string,std::shared_ptr<FlweightGraphicBase>> m_mapFlyweight;
};
//Flyweight.cpp

#include "Flyweight.h"
#include <iostream> FlweightWhiteGraphic::FlweightWhiteGraphic()
{
m_Color = "White";
} void FlweightWhiteGraphic :: PrintColor()
{
std::cout<<"Color is :" << m_Color << std::endl;
} FlweightBlackGraphic::FlweightBlackGraphic()
{
m_Color = "Black";
} void FlweightBlackGraphic :: PrintColor()
{
std::cout<<"Color is :" << m_Color << std::endl;
}
//FlyweightFactory.cpp

#include "FlyweightFactory.h"

std::shared_ptr<FlweightGraphicBase> FlyweightFactory::GetFlyweight(std::string sColor)
{
auto iter = m_mapFlyweight.find(sColor);
if(iter == m_mapFlyweight.end())
{
return nullptr;
} return iter->second;
} void FlyweightFactory::SetFlyweight(std::string sColor,
std::shared_ptr<FlweightGraphicBase> pFlyweight)
{
m_mapFlyweight[sColor] = pFlyweight;
}
//Client.cpp

#include "Flyweight.h"
#include "FlyweightFactory.h"
#include <iostream> void Insert(std::string sColor,
int index,std::shared_ptr<FlweightGraphicBase> pFlweightGraphic)
{
std::cout<<"Posion " << index << " Insert: " << sColor << std::endl ;
} int main()
{
std::shared_ptr<FlyweightFactory> pFlyweightFactory(new FlyweightFactory);
std::shared_ptr<FlweightWhiteGraphic> pFlweightWhiteGraphic(new FlweightWhiteGraphic);
std::shared_ptr<FlweightBlackGraphic> pFlweightBlackGraphic(new FlweightBlackGraphic); pFlyweightFactory->SetFlyweight("White",pFlweightWhiteGraphic);
pFlyweightFactory->SetFlyweight("Black",pFlweightBlackGraphic); auto pFlyweight = pFlyweightFactory->GetFlyweight("White");
Insert("White",,pFlyweight); pFlyweight = pFlyweightFactory->GetFlyweight("Black");
Insert("Black",,pFlyweight); pFlyweight = pFlyweightFactory->GetFlyweight("White");
Insert("White",,pFlyweight); pFlyweight = pFlyweightFactory->GetFlyweight("Black");
Insert("Black",,pFlyweight); while(); }

6.测试结果

实例代码中 所有插入的Graphic 共享黑白两种颜色,位置信息存储在外部。

7.效果

  • 存储节约,和以下因素有关:
  • 1.因为共享,实例总数减少的数目。
  • 2.对象内部状态的平均数目。
  • 3.外部状态是计算的还是存储的。

Flyweight(享元)--对象结构型模式的更多相关文章

  1. Flyweight 享元(结构型)

    一:描述:(该模式实际应用较少) Flyweight 享元模式是对大量细粒度的元素进行共享和重用.减少对象的创建减轻内存: 注和单例模式不同的是:享元模式的各个对象佣有各自的行为并可实例化,单例模式的 ...

  2. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  3. Facade(外观)-对象结构型模式

    1.意图 为子系统中的一组接口提供一个一致的接口,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 2.动机 将一个系统划分成若干子系统有利于降低系统的复杂性.一个常见的设计目 ...

  4. Bridge模式——对象结构型模式

    今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...

  5. Decorator(装饰)-对象结构型模式

    1.意图 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器 Wrapper. 3.动机 给某个对象而不是整个类添加一些功能.一个较为灵 ...

  6. Bridge(桥接)-对象结构型模式

    1.意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 2.动机 在抽象类与它的实现之间起到桥梁作用,使它们可以独立地变化. 3.适用性 不希望在抽象和它的实现部分之间有一个固定的绑定关系. ...

  7. Adapter(适配器)-类对象结构型模式

    1.意图 将一个类接口转换成客户希望的另外一个接口.Adapter模式使那些原本不能一起工作的类,可以一起工作. 2.别名 包装器 Wrapper. 3.动机 一个应用可能会有一些类具有不同的接口,并 ...

  8. Proxy(代理)-对象结构型模式

    1.意图 为其它对象提供一种代理以控制对这个对象的访问. 2.别名 Surrogate. 3.动机 通过Proxy可以达到对一个对象的访问控制. 4.适用性 远程代理  为一个对象在不同地址空间提供局 ...

  9. Composite(组合)--对象结构型模式

    1.意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.动机 可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成 ...

随机推荐

  1. SQLServer2008-镜像数据库实施手册(双机)SQL-Server2014同样适用

    SQL Server2008R2-镜像数据库实施手册(双机)SQL Server2014同样适用 一.配置主备机 1. 服务器基本信息 主机名称为:HOST_A,IP地址为:192.168.1.155 ...

  2. logback 配置

    logback 配置 logback的配置方式包括:编程配置.XML文件配置.Groovy文件配置.对于使用log4j的用户,还可以通过logback提供的工具( http://logback.qos ...

  3. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

  4. Aptana插件安装方法

    本人用的是Zend Studio10.0,在开发项目过程中,发现该软件无法对css和js进行代码提示,这样用起来很不方便,然后在网上找了一下Aptana插件 进入Aptana官网:http://www ...

  5. Create a Listlink

    #ifndef List_h__ #define List_h__ #include <stdio.h> struct ListNode { int value; ListNode* pN ...

  6. leetcode 172

    172. Factorial Trailing Zeroes Given an integer n, return the number of trailing zeroes in n!. Note: ...

  7. 两种open()函数

    C语言中文件操作函数中,open()有两种形式: 一种形式是有两个参数open2: 另一种形式是有三个参数open3: 共有的参数有两个,第一个是"被打开文件的路径",第二个是&q ...

  8. 第六百一十七天 how can I 坚持

    没什么特长,唯一有的仅是妄想,哈哈,真逗. 明天就去新项目组了,会接触些新东西吧,啊,挺好,一开始压力大点很正常,但不要放弃啊. 搞不懂我自己啊,貌似不上火了呢. 睡觉了.忘不掉.做不到.

  9. Hive安装

    一.下载:http://hive.apache.org/,选择合适的版本,Hive 1.X版本要求Hadoop2.x以上版本,Jdk1.7以上 这里选择1.2.1版本 二.安装jdk 略 三.安装Ha ...

  10. Tengine

    Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性. 外文名 Tengine 发起单位 淘宝网 基    础 Nginx 目    ...