C++设计模式——单例模式(Singleton 模式)

单例模式

解决什么问题?

  • 保证一个类仅有一个实例,并提供一个访问它的全局访问点,例如数据库创建等,通常此类对象只需要实例化一次

GOF的UML图

C++设计模式——单例模式(Singleton 模式)_第1张图片

如何实现?

  1. 将构造函数声明为私有的或者保护的,不让外部直接创建该对象
  2. 提供一个静态指针和静态方法,提供全局的访问点

模式分类

1.懒汉模式

  • 在程序运行时,调用到该对象再创建该对象。
  • 加载类时比较快,但运行时获取对象的速度比较慢;线程不安全。

无论是饿汉还是懒汉模式,各自有各自的优点和缺点(时间和空间的权衡),根据实际项目情况,选择使用哪一种模式。

2.饿汉模式

  • 在程序运行之前就创建好该对象,调用时直接获取
  • 加载类时比较慢,但运行时获取对象的速度比较快;线程安全。

单例具体实现

1.懒汉模式
Singleton.h

#ifndef _SINGLETON_H
#define _SINGLETON_H
#include  
#include 
using namespace std;

class Singleton
{
public:
	static Singleton* GetInstance();//访问接口
	~Singleton();

private:
	Singleton();
	static Singleton* instance;
};

#endif

Singleton.cpp

#include "Singleton.h" 
#include 
using namespace std; 

Singleton* Singleton::instance = NULL;

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

////单线程下安全 多线程不安全
//Singleton* Singleton::GetInstance()
//{
//	if (instance == NULL)
//	{
//		instance = new Singleton();
//	}
//	return instance;
//}

//多线程情况下 双检查锁
Singleton* Singleton::GetInstance()
{
	mutex mut;
	if (instance == NULL)
	{
		//上锁
		mut.lock();
		if (instance == NULL)
		{
			instance = new Singleton();
		}
		//解锁
		mut.unlock();
	}
	return instance;
}

main.cpp

#include "Singleton.h" 
#include  
using namespace std;

int main(int argc, char* argv[])
{
	//调用时直接通过类名调用
	Singleton* sgn = Singleton::GetInstance();

	while (true);
	return 0;
}

2.饿汉模式
在程序运行时直接将instance赋值

#include "Singleton.h" 
#include 
using namespace std; 

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

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

Singleton* Singleton::GetInstance()
{
	return instance;
}

你可能感兴趣的:(C/C++)