设计模式之5 - 单例模式Singleton

本文深入介绍了单例模式的实现原理及应用,通过宏定义简化了类的定义与实例化过程,并探讨了线程安全问题及解决方案。

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

        单例模式 是一种创建类型的模式,通过隐藏构造和析构函数,实现在内存中仅有一个对象 的目的。

        Singleton的这种实现方式是非常有价值的,在多个模块或者多个线程中进行访问,可以不需要传递对象或者指针,通过引入头文件即可实现在不同模块解耦。

        先来看Singleton的代码实现:

#ifndef _SINGLETON_H_
#define _SINGLETON_H_

/** Singleton宏定义*/ 
#define SINGLETON_DEFINITION(ClassName)	    \
	                                        \
protected:                                  \
	static ClassName##* m_pThis;            \
	                                        \
	ClassName##();							\
	~ClassName##();                         \
	                                        \
public:                                     \
	/** get instance*/                      \
	static ClassName##* Instance()          \
	{                                       \
		if (!m_pThis)                       \
		{                                   \
             m_pThis = new ClassName##();   \
		}                                   \
		return m_pThis;                     \
    }                                       \
	/** clean up*/                          \
	static void CleanUp()                   \
	{                                       \
		if(m_pThis)                         \
		{                                   \
			delete m_pThis;                 \
			m_pThis = 0;                    \
		}                                   \
    }
/** 初始化*/
#define SINGLETON_IMPLEMENTATION(ClassName) ClassName##* ClassName##::m_pThis = NULL;

#endif // _SINGLETON_H_
        类定义与实现可以直接调用宏,实现简洁的代码:
/** Class类定义*/
class ClassName
{
SINGLETON_DEFINITION(ClassName)

public:
	…
};
/** Class类实现*/
SINGLETON_IMPLEMENTATION(ClassName)

ClassName::ClassName()
{}
ClassName::~ClassName()
{}
…

        有人说在23种设计模式里面,Singleton是使用最广泛的一种,对于这个观点作者并不反对,但从难度上来看,一直是有着Argue,争论点Focus在线程安全上,如何实现线程安全的Singleton呢?

        加锁!加锁的目的在于避免多线程同时创建和删除。

        在哪儿加锁呢?当然是在创建和删除时,也就是对应上面的 if(!m_pThis) 与 if(m_pThis) 代码段内,这里直接用个互斥信号量Mutex就可以了,非常简单,留给读者自己实现!



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值