享元模式(Flyweight):運用共享技術有效地支持大量細粒度的對象。
四個角色類:
- Flyweight享元類:所有具體享元類的超類或接口,通過這個接口,Flyweight可以接受並作用於外部狀態。
- Flyweight享元工廠類:一個享元工廠,用來創建並管理Flyweight,當用戶請求一個Flyweight時,FlyweightFactory對象提供一個已創建的實例或者創建一個(如果不存在的話)。
- ConcreteFlyweight具體享元類:繼承Flyweight超類或實現Flyweight接口,併爲內部狀態增加存儲空間。
- UnSharedConcreteFlyweight不需共享的具體Flyweight子類、指那些不需要共享的Flyweight子類。因爲Flyweight接口類共享成爲可能,但並不強制共享。
模式實現:
//享元類
class Flyweight{
public:
virtual void Operation(int extrinsicState){}
};
//具體享元類
class ConcreteFlyweight: public Flyweight{
public:
virtual void Operation(int extrinsicState)override{
std::cout << "ConcreteFlyweight: " << extrinsicState << std::endl;
}
};
//不需共享的Flyweight子類
class UnSharedConcreteFlyweight: public Flyweight{
public:
virtual void Operation(int extrinsicState){
std::cout << "UnSharedConcreteFlyweight: " << extrinsicState << std::endl;
}
};
//享元工廠,用來創建並管理Flyweight對象
class FlyweightFactory{
private:
std::map<std::string, Flyweight*> flyweights;
public:
FlyweightFactory(){
flyweights["X"] = new ConcreteFlyweight;
flyweights["Y"] = new ConcreteFlyweight;
flyweights["Z"] = new ConcreteFlyweight;
}
Flyweight* GetFlyweight(std::string key){
return (Flyweight*)flyweights[key];
}
};
客戶端:
//Client
int main(){
//外部狀態
int extrinsicState = 22;
//工廠
FlyweightFactory *f = new FlyweightFactory;
Flyweight* fx = f->GetFlyweight("X");
fx->Operation(--extrinsicState); //Output: ConcreteFlyweight: 21
Flyweight* fy = f->GetFlyweight("Y");
fy->Operation(--extrinsicState); //Output: ConcreteFlyweight: 20
Flyweight* fz = f->GetFlyweight("Z");
fz->Operation(--extrinsicState); //Output: ConcreteFlyweight: 19
Flyweight *uf = new UnSharedConcreteFlyweight; //Output: UnSharedConcreteFlyweight: 18
uf->Operation(--extrinsicState);
return 0;
}
享元模式好處:
- 如果一個應用程序使用了大量的對象,而大量的這些對象造成了很大的存儲開銷時就應該考慮使用。
- 對象的大多數狀態可以使用外部狀態,如果刪除對象的外部狀態,那麼可以用相對較少的共享對象取代很多組對象,此時可以考慮使用享元模式。