天天看点

23种设计模式(C++)之 享元(Flyweight)模式23种设计模式(C++)之 享元(Flyweight)模式

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的外部状态。

实例

以造车为例

  1. 创建车抽象类
class Car
{

public:
	virtual string showInfo() = 0;
};
           
  1. 具体化车类
class ElectricCar: public Car
{
private:
	string info;
public:
	ElectricCar(string info)
	{
		this->info = info;
	}
	string showInfo()
	{
		return this->info;
	}
};
           
  1. 创建造车工厂
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];
	}
};
           
  1. 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;
}
           
  1. 结果
create a new object.
blue
blue
           
  1. 分析

    由结果可以看出,client创建了两个车对象,但只new了一次,从而减少了资源的浪费。

继续阅读