C++常用设计模式之单例模式

本文介绍了单例模式的概念、应用场景及其在C++中的实现方式,包括静态成员变量和模板方法等。同时,提醒在多线程环境下需要注意线程安全问题,给出了加锁实现线程安全的示例。最后,通过Windows任务管理器和回收站举例说明了单例模式的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

单例模式 (Singleton)
名称:Singleton(单件模式);
目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点;

适用环境:

当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;
当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

一、单例模式是什么样的?

示例:单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一。

二、使用场景

代码如下(示例):
返回对象,(不用关心最后释放)

#pragma once

class SingleTon_com
{
public:
    static SingleTon_com &GetInstance()
    {
        static SingleTon_com ins;
        return ins;
    }
	SingleTon_com(const SingleTon_com &) = delete;
	SingleTon_com &operator=(const SingleTon_com &) = delete;
    virtual ~SingleTon_com() {}

	void test()
	{
		printf("hello world!");
	}

protected:
	SingleTon_com() {}
};

template <class T>
class SingleTon
{
public:
    static T &GetInstance()
    {
        static T ins;
        return ins;
    }

    virtual ~SingleTon() {}
    SingleTon(const SingleTon &) = delete;
    SingleTon &operator=(const SingleTon &) = delete;

	void test()
	{
		printf("hello world!");
	}
protected:
    SingleTon() {}

};

返回指针的

#pragma once
class CP2PMgr
{
private:
	CP2PMgr(bool isCaller = true)
	{

	}

	CP2PMgr(const CP2PMgr &) = delete;
	CP2PMgr & operator = (const CP2PMgr &) = delete;

public:
	~CP2PMgr(void)
	{

	}
	static  CP2PMgr* getInstance()
	{
		if (p2pMgr == nullptr)
		{
			p2pMgr = new CP2PMgr(false);
		}
		return p2pMgr;
	}
private:
	//内部类,用来最后释放 p2pMgr
	class GC
	{
	public:
		GC()
		{

		}
		~GC()
		{
			if (CP2PMgr::p2pMgr)
				delete CP2PMgr::p2pMgr;
			CP2PMgr::p2pMgr = nullptr;
		}

	};

	static GC m_gc;
	static CP2PMgr* p2pMgr;
};

以上代码在多线程场景下最好不要使用,因为它并不是线程安全的,如需线程安全,最好是加锁控制!如下:

#pragma once

#include <mutex>
using namespace std;
class SingleTon_com_s
{
public:
	static SingleTon_com_s &GetInstance()
	{
		m_mutex.lock();
		static SingleTon_com_s ins;
		m_mutex.unlock();
		return ins;
	}
	SingleTon_com_s(const SingleTon_com_s &) = delete;
	SingleTon_com_s &operator=(const SingleTon_com_s &) = delete;
	virtual ~SingleTon_com_s() {}
	void test()
	{
		printf("hello world!");
	}
protected:
	SingleTon_com_s() {}

public:
	static std::mutex m_mutex;
};
std::mutex SingleTon_com_s::m_mutex; //静态一定要在外部初使化

总结

1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~
  1. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

keivin2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值