Flyweight(享元)--对象结构型模式
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(享元)--对象结构型模式的更多相关文章
- Flyweight 享元(结构型)
一:描述:(该模式实际应用较少) Flyweight 享元模式是对大量细粒度的元素进行共享和重用.减少对象的创建减轻内存: 注和单例模式不同的是:享元模式的各个对象佣有各自的行为并可实例化,单例模式的 ...
- 组合模式/composite模式/对象结构型模式
组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...
- Facade(外观)-对象结构型模式
1.意图 为子系统中的一组接口提供一个一致的接口,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 2.动机 将一个系统划分成若干子系统有利于降低系统的复杂性.一个常见的设计目 ...
- Bridge模式——对象结构型模式
今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...
- Decorator(装饰)-对象结构型模式
1.意图 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器 Wrapper. 3.动机 给某个对象而不是整个类添加一些功能.一个较为灵 ...
- Bridge(桥接)-对象结构型模式
1.意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 2.动机 在抽象类与它的实现之间起到桥梁作用,使它们可以独立地变化. 3.适用性 不希望在抽象和它的实现部分之间有一个固定的绑定关系. ...
- Adapter(适配器)-类对象结构型模式
1.意图 将一个类接口转换成客户希望的另外一个接口.Adapter模式使那些原本不能一起工作的类,可以一起工作. 2.别名 包装器 Wrapper. 3.动机 一个应用可能会有一些类具有不同的接口,并 ...
- Proxy(代理)-对象结构型模式
1.意图 为其它对象提供一种代理以控制对这个对象的访问. 2.别名 Surrogate. 3.动机 通过Proxy可以达到对一个对象的访问控制. 4.适用性 远程代理 为一个对象在不同地址空间提供局 ...
- Composite(组合)--对象结构型模式
1.意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.动机 可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成 ...
随机推荐
- Gold Game
一.项目描述:黄金点游戏 黄金点游戏是一个数字小游戏,其游戏规则是: N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0 ...
- 无需Try catch 的UI事件封装类
在UI处理中,经常需要进行异常处理,以便在错误发生时能够进行一些自定义的操作,比如,弹出消息框给用户,进行重试操作,记录日志等,如果能够让用户写代码时不用写try...catch,而只是关注业务逻辑的 ...
- 在网页中怎样给已发布的Flash添加链接的方法(zhuan)
因为网页中的 Flash 是以控件形式出现的,优先级别较高,所以直接对它加链接是无效的,不过可以用按钮控件 BUTTON 来实现. 具体步骤 1.直接在按钮上加上onClick事件打开指定页面: &l ...
- Nopcommerce 二次开发2 Admin
Admin 菜单 增加 siteMap.config增加一行 <siteMapNode SystemName="Hotels" nopResource="Admin ...
- 剑指Offer:解决难题时的三大方法
1.画图 让抽象的东西变得直观生动起来.比如设计二叉树,链表,栈,队列这些数据结构时. 2.举例子 同样可以化抽象为直观.能够更清晰的展现思路.从例子归纳出一般做法. 3.分解 有时问题本身是比较复杂 ...
- thinkphp3.2!Go for it!
http://document.thinkphp.cn/manual_3_2.html
- 如何创建vss2005的数据库
配置如下 VSS手工创建数据库的步骤(设数据库根目录为D:\VSS): 1.在根目录中创建名为srcsafe.ini(全局配置文件)的文件,文件内容如下: Data_Path = data Temp_ ...
- 微信连wifi
微信连wifi 首先需要到微公众平台添加微信连wifi功能插件
- 用ionic快速开发hybird App(已附源码,在下面+总结见解)
1.ionic简介 ionic 是用于敏捷开发APP的解决方案.核心思路是:利用成熟的前端开发技术,来写UI和业务逻辑.也就是说,就是一个H5网站,这个区别于react-native,native.即 ...
- 使用VirtualBox进行端口转发 连接数据库
转自 http://blog.sina.com.cn/s/blog_484d87770102uxi6.html 使用VirtualBox很久了,很多用法都没有深钻,真的是不虚心学习啊. 由 ...