如何用C++写一个Singleton 单例模式

单例模式是比较常用的设计模式,尤其是在游戏设计中会经常用到,在面试中也是非常容易被问到和实现。今天我们来看看如何用C++来实现一个singleton。

单例模式的主要特性是只能实例化一个对象,在游戏中我们会有各种资源,我们也会在各个地方需要访问这些资源,那么如何得到这些资源呢?我们可以写一个资源管理类来获得各种你想要的资源,问题是在不同的类中如果你想获取游戏资源,就要新建一个资源管理类,这样其实是对内存的浪费。我们其实只需要一个资源管理类就够了,那么这时候就可以使用singleton。

既然只能实例化一个对象,那么就不能让用户直接用new来实例化对象的,因为这样用户将可以实例化很多个对象。我们知道在实例化对象的时候会调用构造函数,为了禁止用户在外部实例化对象,我们可以将构造函数私有化。同样,我们也不应该允许用户copy一个实例,我们可以通过将copy构造函数和赋值函数私有化来禁止copy操作。既然无法在类外实例化对象,用户要如何获得一个对象呢?我们可以提供一个接口,用户需要一个此类对象的时候可以通过这个接口获得。嗯,一个简单的singleton必须包含的内容就这些啦,我们来看看代码怎么实现:


class GameData
{
public:
	static GameData* getInstance()
	{
		if(instance == NULL)
			instance = new GameData();
		return instance;
	}
private:
	static GameData* instance;
	GameData();
	GameData(const GameData& data);
	GameData& operator=(const GameData& data);
};

在使用的时候我们需要在外部对静态实例初始化:

GameData* GameData::instance = NULL;

程序结束时删除此对象:

delete GameData::getInstance();

一个基本的singleton大概这样就可以了,在这里我没有考虑线程安全,只提供一个基本写法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值