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
如果上述描述不符合,可以提醒我修改哦~