23种设计模式(C++)之 享元(Flyweight)模式
- 23种设计模式(C++)之 享元(Flyweight)模式
-
- 意图
- 场景
- 角色
- 实例
23种设计模式(C++)之 享元(Flyweight)模式
意图
运行共享技术有效地支持大量细粒度的对象。
场景
比如购票系统,如果每个顾客访问同样的接口时都要new一个对象,世界人口如此之多,必然会导致存储空间不足。
角色
- Flyweight
- 描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。
- ConcreteFlyweight
- 实现Flyweight接口,并为内部状态(if exists)增加存储空间。ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的,也就是说,它必须独立于ConcreteFlyweight对象的场景。
- UnsharedConcreteFlyweight
- 并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。
- FlyweightFactory
- 创建并管理flyweight对象。
- 确保合理地共享flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(if not exist)。
- Client
- 维持一个对flyweight的引用。
- 计算或存储一个(多个)flyweight的外部状态。
实例
以造车为例
- 创建车抽象类
class Car
{
public:
virtual string showInfo() = 0;
};
- 具体化车类
class ElectricCar: public Car
{
private:
string info;
public:
ElectricCar(string info)
{
this->info = info;
}
string showInfo()
{
return this->info;
}
};
- 创建造车工厂
class FlyweightFactory
{
private:
map<string, Car*> flyweightPool;
public:
Car* getElectricCar(string info)
{
if (!flyweightPool.count(info))
{
flyweightPool[info] = new ElectricCar(info);
cout << "create a new object." << endl;
}
return flyweightPool[info];
}
};
- Client
int main()
{
FlyweightFactory* flyweightFactory = new FlyweightFactory();
Car *car1 = flyweightFactory->getElectricCar("blue");
cout << car1->showInfo() << endl;
Car *car2 = flyweightFactory->getElectricCar("blue");
cout << car2->showInfo() << endl;
}
- 结果
create a new object.
blue
blue
-
分析
由结果可以看出,client创建了两个车对象,但只new了一次,从而减少了资源的浪费。