初入社会戏人生2-单例模式

本文介绍了C++中的单例模式,通过模拟Director类来阐述单例模式的实现,包括其优缺点以及在多线程环境下的安全性问题。文章讨论了如何使用静态成员函数和私有构造函数来确保唯一实例,并提出了在多线程环境下修正单例模式不安全性的思考。
摘要由CSDN通过智能技术生成

04/19/2020

C++ 单例模式

最近在学习cocos2dx游戏引擎,前几个接触的类有一个Director类导演类,它实现的设计模式是单例模式,就是说只能有一个导演在指导拍摄,所以只在没有导演实例情况下被创建,之后都不会创建,直接返回以前创建好的实例。
设计到的知识点:

  • static关键字对成员函数和成员变量使用
  • private私有构造函数

模拟Director类

//类声明和定义没有分开;方便查阅,最好分成.h 和.cpp两个文件
class Director{
public:
	static Director* getInstance()
	{
		if(sSharedDirector != nullptr)
		{
			sSharedDirector = new Director();
			return sSharedDirector;	
		}
		return sSharedDirector;
	}
	static void Destory()
	{
		delete sSharedDirector;
		sSharedDirector = nullptr;
	}
private:
	Director() = default; //默认构造函数
	Director(const Director&) = delete; //没有拷贝构造函数
	Director& operator=(const Director&) = delete;//没有拷贝赋值构造函数。
	static Director* sSharedDirector;
};
static Director* Director::sSharedDirector = nullptr;//静态成员变量定义应该放在类外面;
  • 静态成员函数没有this指针,所以函数内部只能使用静态成员变量
  • 静态成员变量是在Director类中共享的
  • 私有构造函数不允许外界new出新对象

Director 类简单写法

class Director{
public:
	static Director& getInstance()
	{
		static Director sInstance; //静态局部,初始化一次
		return sInstance;
	}
private:
	Director() = default; 
	Director(const Director&) = delete;
	Director& operator=(const Director&) = delete;
};

如何使用Director类

//使用作用域运算符解析::来调用
Director* director = Director::getInstance();
Director* director2 = Director::getInstance();
if(director == director2){
	cout << "share same object";
}
//无法new Director类
Director* director3 = new Director();//invalid, private constructor

单例模式

单例模式(Singleton),保证一个类仅有一个实例,并提供一个方位它的全局访问点。1

导演类的访问点是static修饰的成员函数getInstance()。

单例模式的优缺点

优点

  • 唯一的实例,简单易用,可以减少创建多个对象可能会引起的内存问题的风险,包括内存泄漏,内存占用问题。
  • 严格地控制客户怎样访问它以及何时访问它

缺点

  • 全局的访问点,可以在任何地方获取并访问它的函数,是一种高耦合的设计,一旦单例修改了某一个函数,其他模板都需要修改。
  • 单例的对象在程序结束之前会一直存在,这个唯一的实例难以被释放。

总结

  • 单例的缺点比优点多,最好不要滥用。

提出多线程下地单例模式不安全,如何修改。1

如果上述描述不符合,可以提醒我修改哦~


  1. 引用来源于《大话设计模式》,请去阅读它吧,并解决线程不安全问题。 ↩︎ ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值