人工智能——Singleton模式
上次在状态模式中的设计有一个严重的问题,就是如下:
voidCTroll::ChageState(CState* pNewState)
{
deletem_pCurrentState;
m_pCurrentState=pNewState;
Update();
}
在状态切换中不断有内存申请、删除的操作,如果智能体状态切换频繁,会非常消耗时间。要解决这个问题,就要用到Singleton模式。
Singleton模式有多种实现方法,其核心就是把类构造函数私有化,使得外部不能实例化该类。然后在类内部用一个全局的静态函数来完成类的实例化,用一个静态变量保存唯一实例地址。但为了解决线程安全问题,Scott Meyers在《Effective C++》(Item 04)中提出一种更优雅的单例模式实现,使用local static对象(C++中的static对象是指存储区不属于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(); //静态实例化函数
};
静态实例化函数实现如下:
CState_Runaway*CState_Runaway::GetInstance()
{
staticCState_Runaway runaway; //local static对象
return&runaway;
}
静态实例化函数调用:
voidCState_Runaway::execute(CTroll* troll)
{
if(troll->GetSafe())
{
troll->ChageState(CState_Sleep::Getinstance());
/*静态实例化函数第一次调用时local static对象才被执行,实例化成功后,以后再调用就不会执行了。*/
}
else
{
Run();
}
}
最后别忘了把CTroll的析构函数删除状态指针的语句去掉。
CTroll::~CTroll(void)
{
//delete m_pCurrentState; //由于是静态对象,所以不能用delete删除。delete只能删除heap里的对象,而静态对象在全局区里,随程序结束自动销毁。
}
用singleton模式后,每种状态实例只有一个,全局存在,所以以后智能体不管切换多少次状态都不需要再重新申请内存,大大减少运行时间。
人工智能——Singleton模式的更多相关文章
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- 剑指Offer面试题:1.实现Singleton模式
说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...
- C++ Singleton模式
地址:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却 ...
- Singleton模式——对象创建型模式
Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...
- Singleton模式和Mono-State模式
类和实例 对于大多数的类,都可以创建多个实例.在需要和不需要时,创建和删除这些实例.该过程会伴随着内存的分配和归还. 同时,有一些类,应该仅有一个实例.该实例在程序启动/结束时被创建和删除. root ...
- 转:Singleton模式
C++完美实现Singleton模式 转自:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html boost库的Singleton的实现 ...
- Singleton模式
Singleton模式的特点: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 定义一个Instance操作,允许客户访问它的唯一实例.Instance是一个类操作(C++中的一个静态成员函数 ...
- Objective-C的singleton模式
最近因为在ios应用开发中,考虑到一些公共方法的封装使用,就决定使用单例模式的写法了..不知道,Object-c中的单例模式的写法是否和java中的写法是否有所区别?于是阿堂从网上一搜,发现“ Obj ...
- js中singleton模式解析及运用
singleton模式,又名单例模式.顾名思义,就是只能实例化一次的类(javascript中没有真正的类,我们通常用函数来模拟类,习惯称之为"伪类").具体地说,singleto ...
随机推荐
- su - oracle /bin/bash: Permission denied
1) 以root身份执行 stat / 命令 查看权限是否正确 2) chmod 755 / 3) chmod 755 /bin/bash
- go相关环境变量 PATH GOPATH GOROOT
GOROOT GO语言安装的路径,如MAC下是/usr/local/go,类似于JAVA中的JAVA_HOME. GOPATH GOPATH表示代码包所在的地址,可以设置多个. 假设:GOPATH=~ ...
- LVS专题-(1)LVS基本介绍
LVS官方网站:http://www.linuxvirtualserver.org/zh/lvs1.html
- Ubuntu16.04安装mac主题之图标居中(百度经验)
ubuntu14.04怎么把桌面任务栏调到下方,像Mac那样的 50 匿名 | 浏览 22789 次 我有更好的答案 2015-11-30 16:58 最佳答案 先看图片,感兴趣往下看.按照步骤一 ...
- win2d 图片水印
本文告诉大家如何使用 win2d 给图片加上水印. 安装 首先需要使用 Nuget 安装 win2d ,安装参见win10 uwp win2d 如果没有更新 dot net core 那么在运行可能会 ...
- 了解java虚拟机—垃圾回收算法(5)
引用计数器法(Reference Counting) 引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器减1.只要对象A的引用计数器的 ...
- 胜利大逃亡(续)hdu1429(bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- Android - 注解
原理: http://www.cnblogs.com/Fndroid/p/5354644.html http://www.jianshu.com/p/28edf5352b63 开源库: ButterK ...
- Activity正确获取View宽高
在View的measure完成后,一般可以通过getMeasureWidth/getMeasureWidth方法可以正确的获取View的宽高,而在特殊情况下,可能需要多次measure才能确定最终的测 ...
- python3.8 新特性
https://docs.python.org/3.8/whatsnew/3.8.html python 3.8的新功能本文解释了与3.7相比,python 3.8中的新特性. 有关完整的详细信息,请 ...