ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

单例模式(C++)

2026/9/18 8:22:01 拓冰建站 浏览量
单例模式(C++)

    • 2.12 单例模式
      • 2.12.1 饿汉式
      • 2.12.2 懒汉式

2.12 单例模式

单例模式(Singleton Pattern,也称为单件模式),使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

面向对象编程中,每个对象都应该抽象代表一个设备,并通过对象完成对某个具体设备的管理和维护。

对于有些类只能有一个实例很重要,例如打印机管理器、设备管理器、任务管理器等。

image-20231226151709530

实现单例模式的三个主要步骤:

  • 私有化构造函数

    class Singleton{
    private:Singleton(void){...}Singleton(const Singleton &that){}
    };
    
  • 使用静态成员变量维护唯一的单例对象

    class Singleton{
    private:Singleton(void){...}Singleton(const Singleton &that){}...static Singleton s_instace;
    };Singleton Singleton::s_instace;
    
  • 定义静态成员函数用于获取单例对象

    class Singleton{
    private:Singleton(void){...}Singleton(const Singleton &that){}...static Singleton s_instace;
    public:static Singleton& getInstance(void){return s_instance;}
    };
    Singleton Singleton:s_instace;
    

2.12.1 饿汉式

加载进程时即完成创建(饿),用不用都创建。

#include <iostream>
using namespace std;class Signleton{
private:int m_a;Signleton(int data = 0){m_a = data;}Signleton(const Signleton& that){}static Signleton m_instance;
public:static Signleton& getInstance(void) {return m_instance;}	void print() {cout << m_a << endl;}
};//返回类型	  类   :: 静态成员变量
Signleton Signleton::m_instance = 100;int main(void) {Signleton& s1 = Signleton::getInstance();Signleton& s2 = Signleton::getInstance();s2.print();s1.print();cout << &s1 << endl;cout << &s2 << endl;//Signleton s4 = 199;//error  不支持创建对象return 0;
}

2.12.2 懒汉式

用时再创建(懒),不用再销毁

#include <iostream>
using namespace std;class Signleton{
private:int m_a;static int m_count; //记录对象的引用次数static Signleton *m_instance;Signleton(int data = 0){m_a = data;}Signleton(const Signleton& that){}
public:static Signleton& getInstance(void){if(m_instance == NULL){m_instance = new Signleton(123);}m_count++;return *m_instance;}void release() {m_count--;if(m_count == 0){ //条件成立  说明没有人引用该类了delete m_instance;m_instance = NULL;}}~Signleton(){cout << "distroy" << endl;}
};
Signleton* Signleton::m_instance = NULL;
int Signleton::m_count = 0;int main(void) {//Signleton s1; //errorSignleton& s1 = Signleton::getInstance();Signleton& s2 = Signleton::getInstance();cout << &s1 << " " << &s2 << endl;s1.release();s2.release();return 0;
}