C++学习Day04之单例模式


一、程序及输出

1.1 饿汉式实例

#include<iostream>
using namespace std;
#include <string>
class Printer
{
   
public:
	static Printer * getInstance()//获取实例方法
	{
   
		return printer;
	}

	void printText(string text)
	{
   
		m_Count++;
		cout << text << endl;
	}

	int m_Count;

private:
	Printer() //单例构造函数
	{
    
		m_Count = 0;
		cout << "打印机构造调用" << endl; 
	};

	Printer(const Printer & p){
   };//拷贝构造函数

	static Printer * printer;//单例实体
	
};

Printer * Printer::printer = new Printer();//类外初始化

void test01()
{
   
	Printer * p1 = Printer::getInstance();
	p1->printText("入职证明");
	p1->printText("离职证明");
	p1->printText("加薪申请");
	p1->printText("旅游申请");

	cout << "打印机使用次数: " << p1->m_Count << endl;

	Printer * p2 = Printer::getInstance();
	p2->printText("调休申请");

	cout << "打印机使用次数: " << p1->m_Count << endl;

}

int main(){
   
  cout << "mian函数调用" << endl;    //单例模式编译阶段就分配内存,所以单例模式的构造函数会先打印。
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

输出:
在这里插入图片描述

可以看到,单例的创建是在全局作用域中进行初始化,编译阶段就分配内存,所以单例模式的构造函数会先打印

1.2 饿汉式单例

饿汉式单例模式
在程序启动时即创建单例实例。这样可以确保在多线程环境下也不会出现多个实例被创建的情况。
实现方式是将构造函数私有化,然后在类的内部定义一个静态成员变量来保存单例实例,并提供一个静态成员函数用于获取该实例。

class Singleton {
   
public:
    static Singleton * getInstance() {
   
        return instance;
    }

private:
    Singleton() {
   }

    static Singleton * instance;
};

Singleton * Singleton::instance = new Singleton();

跟我们最开始的实例框架结构一致

1.3 懒汉式单例

懒汉式单例模式
在需要时才创建单例实例。这种方式可能需要考虑多线程环境下的线程安全性。
实现方式是将构造函数私有化,然后在类的内部定义一个静态成员变量指针,并在静态成员函数中进行实例化。

class Singleton {
   
public:
    static Singleton * getInstance() {
   
        if (instance == nullptr) {
   
            instance = new Singleton();
        }
        return instance;
    }

private:
    Singleton() {
   }

    static Singleton * instance;
};

Singleton * Singleton::instance = nullptr;

1.4 线程安全的懒汉式单例

线程安全的懒汉式单例模式
在懒汉式单例模式的基础上,通过加锁等手段来确保在多线程环境下也只有一个实例被创建。
可以使用互斥锁(mutex)或双重检查锁定(double-checked locking)等方式来实现线程安全的单例模式。

class Singleton {
   
public:
    static Singleton * getInstance() {
   
        if (instance == nullptr) {
   
            std::lock_guard<std::mutex> lock(mutex);
            if (instance == nullptr) {
   
                instance = new Singleton();
            }
        }
        return instance;
    }

private:
    Singleton() {
   }

    static Singleton * instance;
    static std::mutex mutex;
};

Singleton * Singleton::instance = nullptr;
std::mutex Singleton::mutex;

二、分析与总结

单例设计模式是一种创建型设计模式,用于确保类只有一个实例,并提供全局访问点以访问该实例
分为饿汉式懒汉式
在具体使用过程中注意线程安全、实例化过程等细节

相关推荐

  1. C++模式

    2024-02-06 06:20:09       37 阅读
  2. C++设计模式模式

    2024-02-06 06:20:09       58 阅读
  3. c++设计模式模式

    2024-02-06 06:20:09       47 阅读
  4. C++ 设计模式模式

    2024-02-06 06:20:09       47 阅读
  5. C++设计模式模式

    2024-02-06 06:20:09       32 阅读
  6. 模式学习

    2024-02-06 06:20:09       48 阅读

最近更新

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

    2024-02-06 06:20:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-06 06:20:09       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-06 06:20:09       82 阅读
  4. Python语言-面向对象

    2024-02-06 06:20:09       91 阅读

热门阅读

  1. 设计模式-单例模式(懒汉+饿汉+线程安全模式)

    2024-02-06 06:20:09       55 阅读
  2. C++单例模式详解

    2024-02-06 06:20:09       39 阅读
  3. 【ASP.NET Core 基础知识】--Web API--Swagger文档生成

    2024-02-06 06:20:09       46 阅读
  4. .NetCore 如何动态路由

    2024-02-06 06:20:09       52 阅读
  5. pytest+allure批量执行测试用例

    2024-02-06 06:20:09       53 阅读
  6. [Lucene]核心类和概念介绍

    2024-02-06 06:20:09       53 阅读
  7. CSS定位

    2024-02-06 06:20:09       57 阅读
  8. 像素、分辨率、公差的概念

    2024-02-06 06:20:09       81 阅读
  9. 如何在Linux系统中安装MySQL

    2024-02-06 06:20:09       49 阅读
  10. MySQL重要进程

    2024-02-06 06:20:09       47 阅读
  11. 在verilog中保留chisel中的注释

    2024-02-06 06:20:09       51 阅读
  12. Qt应用软件【协议篇】TCP示例

    2024-02-06 06:20:09       43 阅读
  13. 用python实现NCL 数据分析与处理实践应用

    2024-02-06 06:20:09       57 阅读
  14. Windows10安装VScode + mingw64 + GSL

    2024-02-06 06:20:09       54 阅读