《HeadFirst 设计模式》读书笔记
目录
定义
单例模式确保一个类只有一个实例,并提供一个全局的访问点。
类图
饿汉单例模式
初始化即实例化。
缺点:若一开始并不需要,会浪费内存和资源。
//饿汉单例模式
class Singleton
{
public:
static Singleton* getInstance()
{
return uniqueInstance;
}
private:
Singleton();
static Singleton *uniqueInstance;
};
//初始化即实例化
Singleton* Singleton::uniqueInstance = new Singleton;
Singleton::Singleton()
{
}
懒汉单例模式
用的时候再初始化。
缺点:不是线程安全的。一个线程再执行new时,另一个线程可能在执行if。
//懒汉单例模式
class LazySingleton
{
public:
static LazySingleton* getInstance()
{
if(uniqueInstance == nullptr)
uniqueInstance = new LazySingleton;
return uniqueInstance;
}
private:
LazySingleton();
static LazySingleton* uniqueInstance;
};
//初始赋空,用的时候才创建。
LazySingleton* LazySingleton::uniqueInstance = nullptr;
LazySingleton::LazySingleton()
{
}
线程安全的单例模式
class ThreadSafeSingleton
{
public:
static ThreadSafeSingleton* getInstance()
{
if(uniqueInstance == nullptr)
{
//两次判断,当获得实例以后就不会再进行lock和unlock操作。
mutex.lock();
if(uniqueInstance == nullptr)
uniqueInstance = new ThreadSafeSingleton;
mutex.unlock();
}
return uniqueInstance;
}
private:
ThreadSafeSingleton();
static ThreadSafeSingleton* uniqueInstance;
static std::mutex mutex;
};
ThreadSafeSingleton* ThreadSafeSingleton::uniqueInstance = nullptr;
ThreadSafeSingleton::ThreadSafeSingleton()
{
}