饿汉式单例模式C++
时间: 2024-06-13 07:01:57 浏览: 9
饿汉式单例模式是一种常见的设计模式,它在程序启动时就实例化了单例对象,因此一加载程序就完成了初始化。这种方式的名字来源于它“先吃”(即预先加载)了单例,避免了懒汉式(延迟加载)可能带来的线程安全问题。
在C++中,饿汉式单例模式的实现通常如下:
```cpp
// 使用静态成员变量和构造函数
class Singleton {
public:
// 静态成员函数返回单例实例
static Singleton& getInstance() {
static Singleton instance; // 饿汉式:一开始就创建实例
return instance;
}
private:
// 构造函数为私有,防止外部直接创建对象
Singleton() {}
// 没有复制构造函数和赋值操作符,防止拷贝
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
```
饿汉式单例模式的优点是:
1. 实例化在编译期间完成,不需要依赖运行时环境,性能较好。
2. 线程安全,因为对象是在编译时创建的,没有线程同步的需求。
然而,饿汉式单例模式的缺点也很明显:
1. 所占内存固定,如果应用不需要该单例,在内存紧张的情况下可能浪费空间。
2. 如果程序中有多个模块需要这个单例,全局唯一的特性可能会导致模块间的耦合度增加。
相关问题
c++绘制饿汉式单例模式
C++中的饿汉式单例模式是一种常见的设计模式,用于保证一个类只能有一个实例,并提供全局访问点。
下面是一个示例代码,演示了如何实现饿汉式单例模式:
```c++
#include <iostream>
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
void doSomething() {
std::cout << "Singleton is doing something" << std::endl;
}
private:
Singleton() {}
~Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
int main() {
Singleton& instance = Singleton::getInstance();
instance.doSomething();
// error: 'Singleton::Singleton(const Singleton&)' is private
// Singleton anotherInstance(instance);
return 0;
}
```
在这个示例中,我们定义了一个Singleton类,并将其构造函数、拷贝构造函数和赋值操作符设置为私有,以防止外部创建实例或复制实例。getInstance方法返回一个静态局部变量,保证了只会创建一个实例,并提供了全局访问点。
相关问题:
1. 什么是单例模式?
2. 饿汉式和懒汉式单例模式有什么区别?
3. 什么是静态局部变量?
4. 如何防止外部复制单例对象?
用C++写出懒汉式单例模式和饿汉式单例模式的例子
以下是C++中懒汉式单例模式和饿汉式单例模式的例子:
1. 饿汉式单例模式
```cpp
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有构造函数
public:
static Singleton* getInstance() {
return instance;
}
};
Singleton* Singleton::instance = new Singleton(); // 在类外初始化静态成员变量
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
if (s1 == s2) {
cout << "s1和s2是同一个实例" << endl;
}
return 0;
}
```
2. 懒汉式单例模式
2.1 简易版
```cpp
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有构造函数
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr; // 在类外初始化静态成员变量
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance(); if (s1 == s2) {
cout << "s1和s2是同一个实例" << endl;
}
return 0;
}
```
2.2 私有嵌套类-回收专用
```cpp
class Singleton {
private:
Singleton() {} // 私有构造函数
~Singleton() {} // 私有析构函数
static Singleton* instance;
class GarbageCollector { // 私有嵌套类
public:
~GarbageCollector() {
if (Singleton::instance != nullptr) {
delete Singleton::instance;
Singleton::instance = nullptr; }
}
};
static GarbageCollector gc; // 静态成员变量,程序结束时自动调用析构函数
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr; // 在类外初始化静态成员变量
Singleton::GarbageCollector Singleton::gc; // 在类外初始化静态成员变量
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
if (s1 == s2) {
cout << "s1和s2是同一个实例" << endl;
}
return 0;
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)