天天看點

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

繼續閱讀