从cocos2d-x看设计模式::单例模式

本文介绍了cocos2d-x游戏引擎中的单例模式,探讨了单例模式的原因、优点和实现方法,并通过分析cocos2d-x源代码中的CCDirector等单例类,展示了单例模式在实际应用中的体现。同时,文章鼓励读者通过学习和交流共同进步。
摘要由CSDN通过智能技术生成

cocos2d-x是一个开源的跨平台游戏引擎,csdn上有很多很好的学习资料分享,这里便不详细讲述。

开源的引擎有很多的好处,其中之一就是可以个人对引擎进行修改,增添适合的特性和功能,增强独特性。这样就不会出现同一引擎做出来的游戏都是相仿的窘况。但是要对引擎进行修改,当然首先要深入学习一下引擎的内部功能。这又可以引出开源的另一个好处,我们可以通过浏览引擎的源代码,学习别人的优点。

因为cocos2d-x是从obj-C移植成C++,里面运用了大量的设计模式,这里先介绍最简单的设计模式——单例模式(Singleton)

单例模式:

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

原因:在一个系统中,通常需要进行全局调控,单例模式比全局变量/全局函数有更优越的特点

1. 通过封装,严格控制客户的访问和隐藏易出错的数据及数据操作

2. 防止命名空间污染,单例模式是对全局变量改进,避免全局变量污染命名空间

3. 对全局变量进行封装,增强的程序的可读性

4. 易于拓展,可以通过继承单件类,对全局操作进行新变化

实现方法:

类声明如下

class Singleton {
private:
	static Singleton* m_singleton;
	Singleton();
public:
	static Singleton* getInstance();
};

单件类中储存着该单例的静态指针,通过私有的构造函数限制用户创建新的实例,而getInstance()返回单件类实例

实现方式如下

Singleton* Singleton::m_singleton = NULL;

Singleton() {}

Singleton* getInstance() {
	if (m_singleton == NULL) {
		m_singleton = new Singleton();
	}
	return m_singleton;
}

单例模式的介绍到此为止,上述就是单例模式的基本框架,当然还需要大家根据不同情况进行增加它的方法。

下面我们来看看cocos2d-x哪里运用了单例模式。

通过查看cocos2d-x源代码的头文件,我们很容易就能发现cocos2d-x中的单件类通过sharedxxxxx()(等价于上述例子中的getInstance)来获取单件类实例。

稍稍搜索就能够找到CCDirectorCCShaderCacheCCScriptEngineManager等都是单件类,现在我们仔细看看CCDirector的代码

//CCDirector.cpp
......
......
static CCDisplayLinkDirector *s_SharedDirector = NULL;

#define kDefaultFPS        60  // 60 frames per second
extern const char* cocos2dVersion(void);

CCDirector* CCDirector::sharedDirector(void)
{
    if (!s_SharedDirector)
    {
        s_SharedDirector = new CCDisplayLinkDirector();
        s_SharedDirector->init();
    }

    return s_SharedDirector;
}

查看CCDirector.cpp,令人意外的是单件类实例是全局静态成员而不是类中的私有静态变量。这岂不是可以全局访问得到,或许是有别的用意我还没看懂?

不过单件类的静态成员方法倒是中规中矩,没有什么特别之处。

至于CCDisplayLinkDirector,不用看头文件也能知道是CCDirector的子类,有兴趣的可以自己翻看一下CCDirector.h

关于cocos2d-x的单例模式就交流到这里,本人也是初学cocos2d-x,有问题的可以评论交流,互相进步,谢谢


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值