享元模式
运用共享技术有效地支持大量细粒度的对象。
本文讲解享元模式框架,代码使用C++语言描述,代码存在的不足或问题有望各位指出。
享元模式代码框架
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Flyweight
{
public:
virtual ~Flyweight(){}
virtual void Operation(const string& extrinsicState)=0;
string GetIntrinsicState()
{
return _intrinsicState;
}
protected:
Flyweight(string intrinsicState)
{
this->_intrinsicState = intrinsicState;
}
private:
string _intrinsicState;
};
class ConcreteFlyweight: public Flyweight
{
public:
ConcreteFlyweight(string intrinsicState): Flyweight(intrinsicState)
{
cout<<"ConcreteFlyweight Build....."<<intrinsicState<<endl;
}
~ConcreteFlyweight(){}
void Operation(const string& extrinsicState) override
{
cout<<"ConcreteFlyweight: 内 蕴 ["<<this->GetIntrinsicState()<<"] 外 蕴 ["<<\
extrinsicState<<"]"<<endl;
}
};
class FlyweightFactory {
public:
FlyweightFactory(){}
~FlyweightFactory()
{
delete fn;
}
Flyweight* GetFlyweight(const string& key)
{
auto it = _fly.begin();
for (; it != _fly.end();it++)
{
//找到了,就一起用
if ((*it)->GetIntrinsicState() == key)
{
cout<<"already created by users...."<<endl;
return *it;
}
}
fn = new ConcreteFlyweight(key);
_fly.push_back(fn);
return fn;
}
protected:
private:
vector<Flyweight*> _fly;
Flyweight* fn =nullptr;
};
int main()
{
FlyweightFactory* fc = new FlyweightFactory();
Flyweight* fw1 = fc->GetFlyweight("hello");
Flyweight* fw2 = fc->GetFlyweight("world!");
Flyweight* fw3 = fc->GetFlyweight("hello");
fw1->Operation("wmw");
fw2->Operation("lkx");
fw3->Operation("fcc");
delete fc;
fw1 = nullptr;
fw2 = nullptr;
fw3 = nullptr;
return 0;
}
享元模式应用
1、享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。
2、如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。