C++学习Day04之单例模式

目录

  • 一、程序及输出
    • [1.1 饿汉式实例](#1.1 饿汉式实例)
    • [1.2 饿汉式单例](#1.2 饿汉式单例)
    • [1.3 懒汉式单例](#1.3 懒汉式单例)
    • [1.4 线程安全的懒汉式单例](#1.4 线程安全的懒汉式单例)
  • 二、分析与总结

一、程序及输出

1.1 饿汉式实例

c 复制代码
#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 饿汉式单例

饿汉式单例模式:

在程序启动时即创建单例实例。这样可以确保在多线程环境下也不会出现多个实例被创建的情况。

实现方式是将构造函数私有化,然后在类的内部定义一个静态成员变量来保存单例实例,并提供一个静态成员函数用于获取该实例。

c 复制代码
class Singleton {
public:
    static Singleton * getInstance() {
        return instance;
    }

private:
    Singleton() {}

    static Singleton * instance;
};

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

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

1.3 懒汉式单例

懒汉式单例模式:

在需要时才创建单例实例。这种方式可能需要考虑多线程环境下的线程安全性。

实现方式是将构造函数私有化,然后在类的内部定义一个静态成员变量指针,并在静态成员函数中进行实例化。

c 复制代码
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)等方式来实现线程安全的单例模式。

c 复制代码
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;

二、分析与总结

单例设计模式是一种创建型设计模式,用于确保类只有一个实例,并提供全局访问点以访问该实例

分为饿汉式和懒汉式

在具体使用过程中注意线程安全、实例化过程等细节

相关推荐
青少儿编程课堂25 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
坤坤子吖3 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
一晌小贪欢4 小时前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
蒸蒸yyyyzwd5 小时前
后端相关学习笔记。
笔记·学习
一条大祥脚5 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
·present·5 小时前
CSAPP(lecture 13_02 Linking)
c语言·c++
旖旎夜光5 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
青少儿编程课堂7 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
白杨尚青8 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树