在cocos2dx中存在不少的单例,虽然单例的设计模式引起不少弊端。我们使用单例目的就是获得全局的唯一一个对象,来做一些事情,那么什么时候用单例什么时候不用单例呢。我觉得一个是从道理上来说,单例在全局应该是唯一的,比如cocos2dx中的导演类,一个游戏应该只有一个导演去完成一些功能,还有就是当你需要在一个类中初始化一个需要设定为单例的对象,为这个对象的成员变量赋值,当在另一类中的时候,我们需要取得这个对象中的成员变量的值的时候,这样就设计成单例的,虽然通过其他的方法也可以完成任务,我觉得设计成单例还是比较方便的,下面给出单例的模板。
| //单例模板 |
| template <class T> class Singleton { public: static T* getInstance(); //获取单例对象 static void freeInstance(); //释放对象 protected: Singleton(){}; //将构造函数私有或保护 private: static T* iInstance; //存对象 }; template <class T> T* Singleton<T>::iInstance = NULL; template <class T> T* Singleton<T>::getInstance() { if(iInstance == 0){ iInstance = new T(); } return iInstance; } template <class T> void Singleton<T>::freeInstance() { if(iInstance){ delete iInstance; iInstance = NULL; } } |
如上的这种写法在程序中的时候你可以用具体的数据类型来代替,但是思路需要按照模板提供的这个思路来写。如果你的程序中有多个类想要设置为单例类,而同样的代码不想重复编写,我们就需要继承这个模板类,然后做一些操作,下面给出我在摸索过程中的一种方法,这种方法是不能完成任务的,但是你可以知道为什么会引出最终的那种方法了。
{
public:
void setAge(int age){m_iAge = age;};
int getAge(){return m_iAge;};
protected:
private:
int m_iAge;
//将构造函数私有,防止产生其他对象
MyClass(){};
};
c->setAge(10);
cout << c->getAge() << endl;
程序运行的时候出错了,因为我们将MyClass的构造函数私有了,在单例模板类中,iInstance=new T();这句话是无法通过的,因为在一个类外是无法访问该类的私有成员的。如果我们将MyClass的构造函数声明为public的,则类外也就可以声明对象了,这和单例的初衷又相悖了。所以利用c++的知识,我们需要将这个单例模板类声明为MyClass类的友元类,这样的话就可以做到了,现在我将MyClass类修改一下,添加一下代码
friend class Singleton<MyClass>; //将单例模板设置为MyClass的友元类