[设计模式]结构模式-轻量级模式(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总结
轻量级模式主要是为了共享对象提供一个统一存放的地方。从而减少大量相同相似对象的开销。运用共享技术有效地支持大量细粒度的对象。运用共享技术有效地支持大量细粒度的对象。