21xrx.com
2024-09-20 01:11:46 Friday
登录
文章检索 我的文章 写文章
C++中的单例模式实现
2023-07-10 15:22:17 深夜i     --     --
C++ 单例模式 实现

单例模式是一种常见的设计模式之一,可确保给定类仅有一个实例存在,并提供对该实例的全局访问点。在C++中实现单例模式可以有多种方式,本文将介绍其中两种。

一、静态成员函数方式

静态成员函数方式是实现单例模式的一种常见方式。在这种方式中,将类的构造函数、复制构造函数以及赋值运算符重载设置为私有的,然后提供一个静态成员函数来获取该类的唯一实例。通过使用静态成员函数,可以直接从类的内部获取实例。以下是C++代码示例:


class Singleton {

public:

  static Singleton& getInstance()

    static Singleton instance;

    return instance;

  

private:

  Singleton() {}

  Singleton(const Singleton&);

  Singleton& operator=(const Singleton&);

};

在这个例子中,需要将构造函数和重载的拷贝构造函数和赋值运算符设置为private,这样就可以防止在类的外部创建该类的实例。在getInstance()函数中,该类的唯一实例被定义为静态局部变量,这是确保只有一个实例的关键所在。这个函数让类的用户通过使用类名可以访问getInstance()函数来获取该类的唯一实例。

二、双重检查锁定方式

双重检查锁定方式是一种实现单例模式的高效方法。与上述方法相比,它使用了两个if语句来检查实例是否已经存在,如果不存在,则创建它。这种方式通常是实现单例模式的首选方法,特别是对于多线程环境,因为它可以保证线程安全。以下是C++代码示例:


class Singleton {

public:

  static Singleton& getInstance() {

    if (instance == nullptr) {

      std::unique_lock<std::mutex> lock(mutex_);

      if (instance == nullptr) {

        instance = new Singleton();

      }

    }

    return *instance;

  }

private:

  Singleton() {}

  Singleton(const Singleton&) = delete;

  Singleton& operator=(const Singleton&) = delete;

  static std::mutex mutex_;

  static Singleton* instance;

};

std::mutex Singleton::mutex_;

Singleton* Singleton::instance = nullptr;

在这个例子中,getInstance()函数包含两个if语句,首先检查该类的实例是否为nullptr,如果为nullptr,它会尝试获取mutex_锁。这个锁确保线程安全,因为在此时只有一个线程可以进入类的构造函数。在加锁区域内,再次检查该类的实例是否为nullptr。如果为空,则创建唯一实例并将其分配给instance指针。

以上两种方式都可以实现单例模式,不同的是每种方式的实现方法略有不同,C++程序员可以根据具体实际应用场景和需求来决定使用哪种方式实现单例模式。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复