人工智能——Singleton模式
上次在狀態(tài)模式中的設(shè)計(jì)有一個(gè)嚴(yán)重的問題,就是如下:
voidCTroll::ChageState(CState* pNewState)
{
?????? deletem_pCurrentState;
?????? m_pCurrentState=pNewState;
?????? Update();
}
在狀態(tài)切換中不斷有內(nèi)存申請(qǐng)、刪除的操作,如果智能體狀態(tài)切換頻繁,會(huì)非常消耗時(shí)間。要解決這個(gè)問題,就要用到Singleton模式。
Singleton模式有多種實(shí)現(xiàn)方法,其核心就是把類構(gòu)造函數(shù)私有化,使得外部不能實(shí)例化該類。然后在類內(nèi)部用一個(gè)全局的靜態(tài)函數(shù)來完成類的實(shí)例化,用一個(gè)靜態(tài)變量保存唯一實(shí)例地址。但為了解決線程安全問題,Scott Meyers在《Effective C++》(Item 04)中提出一種更優(yōu)雅的單例模式實(shí)現(xiàn),使用local static對(duì)象(C++中的static對(duì)象是指存儲(chǔ)區(qū)不屬于stack和heap、"壽命"從被構(gòu)造出來直至程序結(jié)束為止的對(duì)象。其中,函數(shù)內(nèi)的static對(duì)象稱為local static 對(duì)象,而其它static對(duì)象稱為non-local static對(duì)象。對(duì)于local static對(duì)象,在其所屬的函數(shù)被調(diào)用之前,該對(duì)象并不存在,即只有在第一次調(diào)用對(duì)應(yīng)函數(shù)時(shí),local static對(duì)象才被構(gòu)造出來。)比如以下代碼:
classCState_Runaway:publicCState
{
private:???? //構(gòu)造函數(shù),拷貝構(gòu)造和賦值重載全都私有化
?????? CState_Runaway(){};
?????? CState_Runaway(constCState_Runaway&);
?????? CState_Runaway&operator=(constCState_Runaway&);
?
?????? voidRun(){cout<<"I will run away!"<<endl;}
public:???
?????? voidexecute(CTroll* troll);
?????? staticCState_Runaway*GetInstance();? //靜態(tài)實(shí)例化函數(shù)
};
靜態(tài)實(shí)例化函數(shù)實(shí)現(xiàn)如下:
CState_Runaway*CState_Runaway::GetInstance()
{
?????? staticCState_Runaway runaway;??? //local static對(duì)象
?????? return&runaway;
}
靜態(tài)實(shí)例化函數(shù)調(diào)用:
voidCState_Runaway::execute(CTroll* troll)
{
?????? if(troll->GetSafe())
?????? {
????????????? troll->ChageState(CState_Sleep::Getinstance());??
?/*靜態(tài)實(shí)例化函數(shù)第一次調(diào)用時(shí)local static對(duì)象才被執(zhí)行,實(shí)例化成功后,以后再調(diào)用就不會(huì)執(zhí)行了。*/
?????? }
?????? else
?????? {
????????????? Run();
?????? }
}
最后別忘了把CTroll的析構(gòu)函數(shù)刪除狀態(tài)指針的語句去掉。
CTroll::~CTroll(void)
{
?????? //delete m_pCurrentState;?? //由于是靜態(tài)對(duì)象,所以不能用delete刪除。delete只能刪除heap里的對(duì)象,而靜態(tài)對(duì)象在全局區(qū)里,隨程序結(jié)束自動(dòng)銷毀。
}
??? 用singleton模式后,每種狀態(tài)實(shí)例只有一個(gè),全局存在,所以以后智能體不管切換多少次狀態(tài)都不需要再重新申請(qǐng)內(nèi)存,大大減少運(yùn)行時(shí)間。
轉(zhuǎn)載于:https://www.cnblogs.com/aliec/p/8485382.html
總結(jié)
以上是生活随笔為你收集整理的人工智能——Singleton模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows CE(C#)嵌入式应用开
- 下一篇: Arria10_emif