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了一次,進而減少了資源的浪費。