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.动机 可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成 ...
随机推荐
- 黑马程序员_ Objective-c 之Foundation笔记(二)
NSArray NSArray的创建 NSArray *array = [NSArray arrayWithObject:@“jack”] 创建单个元素 NSArray *array3 = [NS ...
- c#与js中10进制16进制的转化,记录防忘
js: var param="11"; param=parseInt(param,16); //17 param=parseInt(param,10); //11 //后面的参 ...
- 【整理】动态加载Web Services
WebClient client = new WebClient(); String url = "http://localhost/MESAPIWebService/MESAPI.asmx ...
- 安装完Pydev却无法创建Python工程
为了方便以后工作,今天在ADT里面安装了Pydev(http://pydev.org/updates),可是安装完之后,新建项目的时候却找不到Pydev,perference中也没有. 紧接着尝试安装 ...
- java BigDecimal add 等方法遇到的问题
//这篇随笔是为了提醒自己避免重复错误 //原先的代码是这样的,想着输出会是9.00,可是结果却是0.00 BigDecimal day_fee = new BigDecimal("0.00 ...
- 这些年正Android - 大学
还记得,第一次看见小周是在大一的操场上. 她正向教学楼站着,一身白配粉的休闲上衣搭配湖蓝色的牛仔裤,穿着一双很平凡的凉鞋,手里拿着当年的Nokia 3110c,皙清的手指,素颜的站着不言不笑.现在回 ...
- artTemplate 自动化编译之tmod
一.背景 前端小白的成长历程,一般都会经历html模板的一些问题,jquery template/artTemplate/yayaTemplate等常见的模板使用,这里就不作介绍了. 先谈谈我们为什么 ...
- Linux 集群
html,body { } .CodeMirror { height: auto } .CodeMirror-scroll { } .CodeMirror-lines { padding: 4px 0 ...
- Take advantage of “Integrated Calling” to know whom suspect talked to
A new feature in iOS 10 is "Integrated Calling". An integrated call from Chat App like Nav ...
- 关于Oracle数据库字符集
我们现在使用的字符集有以下两种: 推荐使用 AL32UTF8,避免以后数据导入导出字符集不同的麻烦. 推荐数据库设置参考图: