1. 单例模式
- 意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。 - 动机
对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印假脱机( printer spooler),只应该有一个文件系统和一个窗口管理器。
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
2. 单例模式的C++
实现
#include <mutex>
using namespace std;
class Singleton
{
private:
static mutex mu;
static Singleton* m_instance;
Singleton(){};
Singleton(const Singleton &);
Singleton& operator = (const Singleton &);
class DelInstance // 它的唯一工作就是在析构函数中删除CSingleton的实例
{
public:
~DelInstance()
{
if (CSingleton::m_pInstance)
delete CSingleton::m_pInstance;
}
};
static DelInstance delIns;
//定义一个静态成员,在程序结束时,系统会调用它的析构函数
public:
static Singleton* Instance(){
if (m_instance == NULL){
std::lock_guard<std::mutex> Lock(mu);
if(m_instance==NULL){
m_instance = new Singleton();
}
}
return m_instance;
}
};
//类的静态变量需要手动初始化
Singleton* Singleton::m_instance = 0;
mutex Singleton::mu;
Singleton::DelInstance Singleton::delIns;
单例模式的Java实现
参考《Head First Design Pattern》
(1) 简单实现
(2) 考虑线程安全
(3) 线程安全升级版
(4) 使用“双检锁”的方式保证线程安全