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