【C++ 设计模式】单例模式的两种懒汉式和饿汉式
文章目录
- 1. 单例模式
- 2. 单例模式简单示例
- 3. 懒汉模式
- 4. 饿汉模式
- 5. 懒汉式和饿汉式的区别
1. 单例模式
-
🐧定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
-
单例模式是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实列而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
特点:
-
🍎单例类只有一个实列对象。
-
🍎单例类必须自己创建自己的唯一实例。
-
🍎单例类对外提供一个可访问该单例的全局访问点。
主要解决:全局使用的类频繁地创建与销毁。
优点:避免对资源的多重占用。在内存里只有一个实例,减少内存的开销,尤其是频繁的创建和销毁实例。
2. 单例模式简单示例
// 单例模式 --- 不让用户自己创建对象
class TestA {
public:
// 设置为静态成员函数,可以不用创建对象直接通过类名进行访问
static TestA* GetInstance() {
return data;
}
private:
// 把构造函数定为 private,目的是不让用户自己创建对象,必须把构造函数进行设为私有化
TestA()
{
data = new TestA;
}
private:
static TestA* data;
};
TestA* TestA::data = NULL; // 静态成员变量必须在类外部单独进行定义
int main()
{
TestA::GetInstance();
}
3. 懒汉模式
class SingleModeLazy {
private:
SingleModeLazy() {
cout << "执行操作: 懒汉式构造函数被调用。" << endl;
}
public:
static SingleModeLazy* GetInstance() {
if (ptrSingleModeLazy == NULL) {
ptrSingleModeLazy = new SingleModeLazy();
}
return ptrSingleModeLazy;
}
private:
static SingleModeLazy* ptrSingleModeLazy;
};
SingleModeLazy* SingleModeLazy::ptrSingleModeLazy = NULL;
4. 饿汉模式
// 饿汉式
class SingleHungry {
private:
SingleHungry() {
cout << "执行操作:饿汉构造函数被调用。" << endl;
}
public:
static SingleHungry* GetInstance() {
return ptrSingleHungry;
}
private:
static SingleHungry* ptrSingleHungry;
};
SingleHungry* SingleHungry::ptrSingleHungry = new SingleHungry;
5. 懒汉式和饿汉式的区别
-
🍎实例创建时机:
(1)饿汉式在程序启动时就创建实例;
(2)懒汉式在第一次使用时才创建实例; -
🍎资源利用:
(1)饿汉式可能会造成资源浪费,因为它不管是否使用这个实例都会创建实例;
(2)懒汉式只有在需要时才创建实例,更加节省资源; -
🍎线程安全:
(1)饿汉式不需要考虑线程安全问题,因为实例在程序启动时就已经创建;
(2)懒汉式需要考虑线程安全问题,因为多个线程可能尝试同时创建实例; -
🍎适用场景:
(1)如果实例必须在程序启动时就可用,或者资源消耗不大,可以选择饿汉式。
(2)如果实例可能不被使用,或者资源消耗较大,希望延迟加载,可以选择懒汉式。