[设计模式]结构模式-轻量级模式(C++描述)

[设计模式]结构模式-轻量级模式(C++描述)

second60 20180502

 

1. 什么是轻量级模式

通常情况下,一个系统有很多细粒度对象,造成了很大的存储开销。

 

轻量级模式,又称享元模式,运用共享技术有效地支持大量细粒度对象的复用。即系统只使用少量的对象,这些对象很相似,状态变化很小,可以实现对象的多次复用。

轻量级模式共享的关键是区分了内部状态外部状态


概念

内部状态:存储有享元对象内部并且不会随环境改变而改变的状态,内部状态或以共享。

外部状态:由客户保存并传入到享元对象内部,随环境改变而改变,不可共享的状态。

 

2 轻量级模式结构图

 

分析:

FlyweightFactory: 享元对象工厂,创建管理享元对象,客户向工厂进行请求,并返回相应对象给客户

Flyweight: 享元对象抽象基类,规定了享元解色的方法,从外部传入参数来获得具体享元

ConcreteFlyWeight: 具体享元对象,

代码:

class Flyweight

{

public:

Flyweight(const string& innerState){_innerState = innerState;}

virtual ~Flyweight(){};

virtual void Operation(const  string&  outerState){}

string getInnerState(){return _innerState;}

private:

string _innerState;

};

 

class ConcreteFlyweight: public  Flyweight

{

public:

ConcreteFlyweight(const string& innerState):Flyweight(innerState);

~ConcreteFlyweight(){}

void Operation(const string& outerState){};

};

class FlyweightFactory

{

public:

Flyweight* GetFlyweight(const string& key)

{

vector<Flyweight*>::iterator iter = _flyVector.begin();

for(; iter != _flyVector.end(); ++iter)

{

if((*it)->GetInnerState() == key)

{

return *it;

}

}

}

private:

vector<Flyweight*> _flyVector;

};


FlyweightFactory * factory = new FlyweightFactory();

Flyweight* f1 = factory->GetFlyweight(“key1”);

Flyweight* f2 = factory->GetFlyweight(“key2”);

Flyweight* f3 = factory->GetFlyweight(“key1”);

 

上面为简单享元对象,如果是多种不同享元实现类,那么工厂中可以用map来存储。

2.1优点

1. 减少内存对象的数量,

2. 分离出外部状态,对对象内部相对独立

3. 统一管理相同对象,方便查找计算

 

2.2缺点

需要分出对象的外部状态和内部状态

1. 使系统变得复杂,逻辑复杂

 

3使用场景

1. 系统有大量相同或相似的对象,造成内存大量的消耗

2. 对象的大部份状态可以外部传入对象中

3. 享元模式需要维护一个存储享元对象的对象池,需耗一定的资源,应当在需要多次重复使用享元对象时才值得使用。

 

4享元模式和简单工厂

享元模式:是为了避免大量细粒度相同对象造成的开销

工厂模式:使系统不依赖于实现细节

 

5总结

轻量级模式主要是为了共享对象提供一个统一存放的地方。从而减少大量相同相似对象的开销。运用共享技术有效地支持大量细粒度的对象。运用共享技术有效地支持大量细粒度的对象。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值