C++单例模式多种实现技巧介绍(C++单例模式实现技巧详解:多种方法全面解析)

原创
ithorizon 6个月前 (10-21) 阅读数 25 #后端开发

C++单例模式实现技巧详解:多种方法全面解析

一、单例模式概述

单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式通常用于管理共享资源,如数据库连接、线程池等。

二、单例模式的实现方法

下面将介绍C++中常见的几种单例模式实现技巧。

1. 饿汉式单例

饿汉式单例在程序开端时就创建实例,确保全局只有一个实例。

class Singleton {

public:

static Singleton& getInstance() {

static Singleton instance;

return instance;

}

private:

Singleton() {} // 私有构造函数

Singleton(const Singleton&); // 禁止拷贝构造

Singleton& operator=(const Singleton&); // 禁止赋值操作

};

2. 懒汉式单例

懒汉式单例在第一次调用getInstance()时创建实例,实现延迟初始化。

#include

class Singleton {

public:

static Singleton* getInstance() {

if (instance == nullptr) {

std::lock_guard lock(mtx);

if (instance == nullptr) {

instance = new Singleton();

}

}

return instance;

}

static void destroyInstance() {

if (instance != nullptr) {

delete instance;

instance = nullptr;

}

}

private:

Singleton() {} // 私有构造函数

Singleton(const Singleton&); // 禁止拷贝构造

Singleton& operator=(const Singleton&); // 禁止赋值操作

static Singleton* instance;

static std::mutex mtx;

};

Singleton* Singleton::instance = nullptr;

std::mutex Singleton::mtx;

3. 静态局部变量单例

静态局部变量单例利用C++11的特性,局部静态变量的初始化是线程可靠的。

class Singleton {

public:

static Singleton& getInstance() {

static Singleton instance;

return instance;

}

private:

Singleton() {} // 私有构造函数

Singleton(const Singleton&); // 禁止拷贝构造

Singleton& operator=(const Singleton&); // 禁止赋值操作

};

4. 拷贝控制单例

通过禁用拷贝构造函数和赋值操作符,确保单例的实例不能被复制或赋值。

class Singleton {

public:

static Singleton& getInstance() {

static Singleton instance;

return instance;

}

private:

Singleton() {} // 私有构造函数

Singleton(const Singleton&) = delete; // 禁止拷贝构造

Singleton& operator=(const Singleton&) = delete; // 禁止赋值操作

};

5. 线程局部存储单例

使用线程局部存储(thread-local storage, TLS)确保每个线程有自己的单例实例。

#include

class Singleton {

public:

static Singleton& getInstance() {

thread_local static Singleton instance;

return instance;

}

private:

Singleton() {} // 私有构造函数

Singleton(const Singleton&); // 禁止拷贝构造

Singleton& operator=(const Singleton&); // 禁止赋值操作

};

6. 静态初始化器单例

使用静态初始化器在程序终止时销毁单例实例。

#include

class Singleton {

public:

static Singleton& getInstance() {

static Singleton instance;

return instance;

}

static void destroyInstance() {

delete instance;

instance = nullptr;

}

void doSomething() {

std::cout << "Doing something..." << std::endl;

}

private:

Singleton() {} // 私有构造函数

~Singleton() { std::cout << "Destroying instance..." << std::endl; }

Singleton(const Singleton&); // 禁止拷贝构造

Singleton& operator=(const Singleton&); // 禁止赋值操作

};

Singleton* Singleton::instance = nullptr;

struct SingletonDestroyer {

~SingletonDestroyer() {

Singleton::destroyInstance();

}

};

SingletonDestroyer destroyer;

三、单例模式的使用场景

单例模式适用于以下场景:

  • 当系统中需要一个类来控制资源的访问时,如数据库连接、文件系统等。
  • 当需要确保一个类只有一个实例,且这个实例需要全局访问时。
  • 当实例的创建和销毁需要集中管理时。

四、单例模式的优缺点

优点:

  • 控制了实例的数量,确保全局只有一个实例。
  • 降低了系统的资源消耗。
  • 提供了全局访问点。

缺点:

  • 违反了单一职责原则。
  • 大概让代码难以测试。
  • 大概让代码的灵活性降低。

五、总结

单例模式是一种常用的设计模式,用于确保一个类只有一个实例。C++提供了多种实现单例模式的方法,开发者可以通过实际需求选择合适的实现行为。在使用单例模式时,要注意其优缺点,以及适用场景。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门