单例模式
Ensure a class has only one instance, and provide a global point of access to it.
(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)
通用类图设计
class Singleton {
public:
static Singleton getSingleton() {
return msingleton;
}
private:
static Singleton* msingleton;
Singleton() {}
};
Singleton* Singleton::msingleton = new Singleton();
其他的类通过Singleton::getSingleton()得到Singleton类的句柄。
其构造函数为私有保证了一个应用中只产生一个实例,并且是自行实例化的。
优点:
减少内存开支,不用频繁的创建销毁
减少系统的性能开销,当一个对象产生较多的资源,使用单例可以用永久驻留内存的方式解决
避免对资源的多重占用,例如写文件时避免对用一个资源文件的同时写操作
可以在系统设置全局的访问点,优化和共享资源访问
缺点:
一般没有接口,很难扩展。
对测试不利,当单例没有完成,不能进行测试。
单例模式与单一职责原则有冲突,单例模式把“要单例”和业务逻辑融合在一个类中。
使用场景:
要求生成唯一序列号的环境时
在整个项目中需要一个共享访问点或共享数据时
创建一个对象需要消耗的资源过多时
需要定义大量的静态常量和静态方法的环境时
注意事项:
高并发的情况下,需要注意单例模式和线程同步问题,懒汉模式(通过加线程锁),饿汉模式(static初始化就new)
扩展:
单例模式—>多例模式,通过静态常量限制对象的个数即可。
示例代码
#include <iostream>
using namespace std;
class Emperor {
public:
static Emperor* getInstance() {
return memperor;
}
static void say() {
cout << "Emperor zhang" << endl;
}
private:
static Emperor *memperor;
Emperor() {}
};
Emperor* Emperor::memperor = new Emperor();
int main() {
Emperor *emperor = Emperor::getInstance();
emperor->say();
return 0;
}