Singleton 考虑内存的释放和多线程

设计模式中的Singleton确保类只有一个实例并提供全局访问点。它优于全局变量,因为类自身管理实例创建,防止多实例化。关键点包括构造函数私有和静态GetInstance方法。在C++中,需关注内存释放;在C++、Java、C#的多线程环境中,需解决同步问题。

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

GOF的《设计模式》中这样描述:保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能阻止你实例化多个对象。一个最好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

也就是说,很多时候我们需要全局的对象,如一个工程中,数据库访问对象只有一个,这时,可以考虑使用单例模式。单例模式比全局对象好还包括:单例类可以继承,如下例。

单例模式的关键点在于:构造函数私有,静态的GetInstance。

另外,在C++中必须注意内存的释放。C++、Java、C#中还要注意多线程时的同步问题(下面的程序还没考虑多线程)。

#include <iostream>
using namespace std;

class Singleton {
private:
	Singleton() {} //①constructor declare private
	static Singleton* single; //③static member
public:
	static Singleton* getInstance() { //② static member function
		if(single == NULL)
			single = new Singleton();
		return single;
	}

	class Garbo {			//它的唯一工作就是在析构函数中删除
	public:
		~Garbo() {
			if(getInstance())
				delete getInstance();
		}

		static Garbo garbo; //// 定义一个静态成员,在程序结束时,系统会调用
		//它的析构函数,该析构函数会删除单例的唯一实例。
	};
	/*
	 * 考虑 memory leak 和 multithread(没有考虑)
	 *
	 *
	 * 使用这种方法释放C++单例模式对象有以下特征:
		在单例类内部定义专有的嵌套类Garbo。
		在单例类内定义私有的专门用于释放的静态成员。
		利用程序在结束时析构全局变量的特性,选择最终的释放时机。
		使用C++单例模式的代码不需要任何操作,不必关心对象的释放。*/

};

int main() {
	Singleton *s1 = Singleton::getInstance();
	Singleton *s2 = Singleton::getInstance();
	if(s1 == s2)
		cout << "Singleton is success";
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值