单例模式(C++)

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; //error
	
	Signleton& s1 = Signleton::getInstance();
	Signleton& s2 = Signleton::getInstance();

	cout << &s1 << " " << &s2 << endl;

	s1.release();
	s2.release();
	return 0;
}

相关推荐

  1. 模式C#】

    2023-12-29 08:42:05       54 阅读
  2. 模式C++)

    2023-12-29 08:42:05       50 阅读
  3. C++ 模式

    2023-12-29 08:42:05       64 阅读
  4. C++ 模式

    2023-12-29 08:42:05       57 阅读
  5. C# 模式

    2023-12-29 08:42:05       41 阅读
  6. C++模式

    2023-12-29 08:42:05       28 阅读
  7. c++ 模式

    2023-12-29 08:42:05       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-29 08:42:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-29 08:42:05       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-29 08:42:05       82 阅读
  4. Python语言-面向对象

    2023-12-29 08:42:05       91 阅读

热门阅读

  1. 单例模式的双重检查锁定是什么?

    2023-12-29 08:42:05       51 阅读
  2. 创建型--单例模式

    2023-12-29 08:42:05       63 阅读
  3. C#判断骨龄与生活年龄的比较

    2023-12-29 08:42:05       52 阅读
  4. [云原生] Go web工作流程

    2023-12-29 08:42:05       60 阅读
  5. react的render什么时候渲染?

    2023-12-29 08:42:05       53 阅读
  6. Linux安装Python3.12.0

    2023-12-29 08:42:05       56 阅读
  7. 表情串转换

    2023-12-29 08:42:05       57 阅读
  8. Ubuntu 2x.04 编译FFmpeg 脚本

    2023-12-29 08:42:05       63 阅读
  9. 高阶组件和高阶函数是什么

    2023-12-29 08:42:05       57 阅读
  10. flutter学习-day22-使用GestureDetector识别手势事件

    2023-12-29 08:42:05       45 阅读