21xrx.com
2025-06-13 23:23:27 Friday
文章检索 我的文章 写文章
C++单例模板实现
2023-07-08 15:14:28 深夜i     16     0
C++ 单例模式 模板 实现 设计模式

C++单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问该实例的机制。单例模式在许多场合下都非常有用,如数据库连接、线程池等对象的管理。

在C++中,实现单例模式有多种方法,其中一个常用的实现方式是使用模板。以下是一个简单的C++单例模板实现:

template<typename T>
class Singleton
{
private:
  static T* m_instance;
public:
  static T* getInstance()
  {
    if (m_instance == nullptr)
    {
      m_instance = new T();
    }
    return m_instance;
  }
  static void destroyInstance()
  {
    if (m_instance != nullptr)
    
      delete m_instance;
      m_instance = nullptr;
    
  }
protected:
  Singleton() {}
  virtual ~Singleton() {}
  Singleton(const Singleton&) = delete;
  Singleton& operator=(const Singleton&) = delete;
};
template<typename T>
T* Singleton<T>::m_instance = nullptr;

这个模板定义了一个名为Singleton的类模板,其中包含了一个静态的指向单例对象的指针m_instance。使用getInstance()方法来获取单例对象,如果实例还不存在,则通过new创建一个新实例;使用destroyInstance()方法来销毁单例对象,释放内存并将指针置为nullptr。

注意,这种实现方式还使用了C++11的delete关键字禁用了复制和赋值操作符,以确保只有一个实例存在。如果需要实现单例对象复制,可以将这两行代码注释掉。

使用这个单例模板也非常简单,只需继承自Singleton类,并将要实现单例模式的类作为模板参数即可,例如:

class MyClass : public Singleton<MyClass>
{
public:
  void foo() cout << "hello world" << endl;
private:
  friend class Singleton<MyClass>;
  MyClass() {}
  virtual ~MyClass() {}
};

这个示例中,MyClass继承自Singleton ,表示MyClass类是一个使用单例模式的类。注意,MyClass需要将Singleton 声明为友元,以便Singleton类可以访问MyClass的构造函数和析构函数。

现在可以通过getInstance()方法来获取MyClass类的实例,并通过调用foo()方法来使用它:

MyClass* obj1 = MyClass::getInstance();
obj1->foo(); // 输出 "hello world"
MyClass* obj2 = MyClass::getInstance();
assert(obj1 == obj2); // 断言obj1和obj2是同一个实例
MyClass::destroyInstance(); // 销毁单例对象

总之,C++单例模板是一种简单而可靠的实现单例模式的方式。如果您需要使用单例模式来管理对象生命周期,这种实现方式值得一试。

  
  

评论区