在Cocos2d-x中存在不少的单例,虽然单例的设计模式引起不少弊端。我们使用单例目的就是获得全局的唯一一个对象,来做一些事情,那么什么时候用单例什么时候不用单例呢。
我觉得一个是从道理上来说,单例在全局应该是唯一的,比如cocos2dx中的导演类,一个游戏应该只有一个导演去完成一些功能,还有就是当你需要在一个类中初始化一个需要设定为单例的对象,为这个对象的成员变量赋值,当在另一类中的时候,我们需要取得这个对象中的成员变量的值的时候,这样就设计成单例的,虽然通过其他的方法也可以完成任务,我觉得设计成单例还是比较方便的,下面给出单例的模板。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
/************************************************************************/
/* 单例模版 */
/************************************************************************/
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
template
<
class
T>
Singleton
{
private
:
//该变量中存放这个全局的变量
static
T * iInstance;
//将构造函数私有或者是保护
protected
:
Singleton(){};
public
:
//获得单例对象
T * getInstance();
//释放单例对象
static
void
FreeInstance();
};
T>
T * Singleton<T>::iInstance=NULL;
T>
T * Singleton<T>::getInstance()
{
if
(iInstance == 0)
{
iInstance=
new
T();
}
return
iInstance;
}
T>
void
Singleton<T>::FreeInstance()
{
(iInstance)
{
delete
iInstance;
iInstance=NULL;
}
}
#endif
|
#include "Singleton.h"
//该类继承自模板单例类
MyClass :
Singleton<MyClass>
{
:
//添加这个类自己的一些成员变量
int
age;
//对象,这样的话就没有做到真正的单例。c++中成员的默认访问权限是private不假,但是当我们没有默认的构造函数
MyClass(){};
:
setAge(
age){
this
->age = age;};
getAge(){
age;};
};
MyClass::getInstance()->setAge(10);
cout<<MyClass::getInstance()->getAge()<<endl;
//将构造函数私有所以这里不能声明对象
//MyClass my;
|
#include <iostream>
#include "Singleton.h"
using
namespace
std;
//Test类继承自单例模板类
Test :
Singleton<Test>
{
//将单例模板类声明为Test类的友元类
friend
class
Singleton<Test>;
//将构造函数私有
Test(){};
//这里添加test类的其他一些成员
age;
//这里添加test类的其他一些成员
:
->age = age;};
age;};
};
//将构造函数私有所以这里不能声明对象
//Test t;
Test::getInstance()->setAge(30);
cout<<Test::getInstance()->getAge()<<endl;
|