人工智能——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 ...
随机推荐
- Spring事务传播属性介绍(一).required 和 reuqires_new
Mandatory.Never.Not_Support传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10260030.html Nested传播 ...
- js实现时间日期的格式化
前几天参加cvte的笔试,碰到了这样一道题目: //请写一个时间日期格式化的函数,具体要求如下: function format(date,"yyyy-mm-dd HH-mm-ss" ...
- 在WPF中实现平滑滚动
WPF实现滚动条还是比较方便的,只要在控件外围加上ScrollViewer即可,但美中不足的是:滚动的时候没有动画效果.在滚动的时候添加过渡动画能给我们的软件增色不少,例如Office 2013的滚动 ...
- 微信小程序开发资料汇总
>> 微信小程序开发工具下载 社区推荐: >>蜂鸟-微信小程序开发者社区>> 很快-微信小程序开发者社区 博文推荐: >> 微信小程序开源Demo精选& ...
- arcgis按要求删除点位
第一篇博客 嘻嘻 上图 1
- Spring全家桶系列–[SpringBoot入门到跑路]
//本文作者:cuifuan Spring全家桶————[SpringBoot入门到跑路] 对于之前的Spring框架的使用,各种配置文件XML.properties一旦出错之后错误难寻,这也是为什么 ...
- servlet 中处理 json 请求,并访问 service 类,返回处理结果
前言:jar 包中的 servlet 必须可以处理前端发出的 ajax 请求,接收参数,并返回结果. github地址:yuleGH github 这里有个约定,url 地址是 .json 结尾的,如 ...
- php命令行按模板生成应用的入口文件
接着这篇文章php命令行生成项目结构 继续改造: ghostwu@dev:~/php/php1/12$ tree . ├── app │ └── index.php ├── core │ ├─ ...
- 初学HTML-2
HTML标签的分类:单标签:只有开始标签,没有结束标签,即,只由一个<>组成的html. 双标签:有开始标签和结束标签,即,由一个<>和一个</ >组成的h ...
- position sticky的兼容
position的sticky这个属性一般用于导航条,因为他在屏幕范围(viewport)时该元素的位置并不受到定位影响(设置是top.left等属性无效),当该元素的位置将要移出偏移范围时,定位又会 ...