Flyweight模式
一.意圖
運用共享技術有效地支持大量細粒度的對象
二.適用性
1. 一個應用程序使用了大量的對象
2. 完全由於使用大量的對象,造成很大的存儲開銷
3. 對象的大多數狀態都可變爲外部狀態
4. 如果刪除對象的外部狀態,那麼可以用相對較少的共享對象取代很多組對象
5. 應用程序不依賴對象標識,由於flyweight對象可以被共享,對於概念上明顯有別的對象,標識測試將返回真值.
三.結構
四.代碼
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
usingnamespacestd;
//flyweightmode
//內部狀態:類型
enumenFruitType
{
TYPE_NULL=0,
TYPE_APPLE,
TYPE_BANANA,
TYPE_ORANGE,
};
//flyweight
classCFlyWeight
{
public:
virtualvoidOperation(stringname){}
//獲取內部狀態
virtualenFruitTypeGetIntrinsicState(){}
protected:
enFruitTypem_fruitType=TYPE_NULL;
};
//具體亨元模式
classCConcreteFlyWeight:publicCFlyWeight
{
public:
CConcreteFlyWeight(enFruitTypefruitType)
{
this->m_fruitType=fruitType;
}
virtualenFruitTypeGetIntrinsicState()
{
returnm_fruitType;
}
virtualvoidOperation(stringname)
{
stringbuyName=name;
cout<<buyName<<"buyfruit"<<m_fruitType<<endl;
}
};
//不共享的具體亨元,客戶端直接調用
classCUnsharedConcreteFlyweight:publicCFlyWeight
{
public:
virtualvoidOperation(stringname)
{
CFlyWeight*flyweight=NULL;
for(inti=0;i<m_pvecFactory.size();i++)
{
flyweight=newCConcreteFlyWeight(m_pvecFactory[i]);
flyweight->Operation(name);
}
}
voidadd(enFruitTypetype)
{
this->m_pvecFactory.push_back(type);
}
private:
vector<enFruitType>m_pvecFactory;
};
classCFlyweightFactory
{
public:
//1.複合亨元模式,不共享內部狀態
CUnsharedConcreteFlyweight*GetFlyweight(vector<enFruitType>compositeState){
CUnsharedConcreteFlyweight*compositeFlyweight=newCUnsharedConcreteFlyweight();
for(inti=0;i<compositeState.size();i++)
{
compositeFlyweight->add(compositeState[i]);
}
returncompositeFlyweight;
}
//2.單純亨元模式,共享內部狀態
CFlyWeight*GetFlyweight(enFruitTypetype)
{
for(inti=0;i<m_pvecFactory.size();i++)
{
if(m_pvecFactory[i]->GetIntrinsicState()==type)
{
returnm_pvecFactory[i];
}
}
CFlyWeight*flyweight=newCConcreteFlyWeight(type);
this->m_pvecFactory.push_back(flyweight);
returnflyweight;
}
voidGetFlyweightCount()
{
cout<<"num="<<this->m_pvecFactory.size()<<endl;
}
private:
vector<CFlyWeight*>m_pvecFactory;
};
intmain()
{
cout<<"HelloWorld!"<<endl;
cout<<"1.----------------------------------------"<<endl;
// CFlyweightFactory*factory=newCFlyweightFactory();
// CFlyWeight*flyweight=factory->GetFlyweight(TYPE_APPLE);
// CFlyWeight*flyweight1=factory->GetFlyweight(TYPE_APPLE);
// CFlyWeight*flyweight2=factory->GetFlyweight(TYPE_BANANA);
// flyweight->Operation("Tom");
// flyweight1->Operation("Black");
// flyweight2->Operation("Jack");
// factory->GetFlyweightCount();
cout<<"2.----------------------------------------"<<endl;
vector<enFruitType>compositeState;
compositeState.push_back(TYPE_APPLE);
compositeState.push_back(TYPE_BANANA);
compositeState.push_back(TYPE_ORANGE);
compositeState.push_back(TYPE_APPLE);
CFlyweightFactory*factory=newCFlyweightFactory();
CFlyWeight*flyweight=factory->GetFlyweight(compositeState);
CFlyWeight*flyweight1=factory->GetFlyweight(compositeState);
flyweight->Operation("Composite");
flyweight1->Operation("Composite1");
return0;
}