1. 意图
什么是单例模式?在GOF的《设计模式:可复用面向对象软件的基础》中这样描述:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2. 单例模式特点
- 单例类仅有一个且唯一的实例;
- 单例类必须在自己内部创建该实例;要构造一个实例,就必须调用该类的构造函数,因此该类的构造函数须定义为protected或private,这样客户端程序就不能通过构造函数创建实例。
- 向其他类提供这个实例类(静态实例是公有的);
除此之外,单例模式还有很多有用的特点,比如爱奇艺2016研发工程师面试题中:单例模式的类具有?
- A. 没有公有构造方法,有一个公有静态工厂方法和一个静态实例变量
- B. 没有公有构造方法,有一个私有静态工厂方法和一个静态实例变量
- C. 有公有构造方法,没有静态工厂方法和静态实例变量
- D. 没有公有构造方法,没有静态工厂方法,也没有静态实例变量
答案及分析:A。分析待写
3. C++代码实现
(1)懒汉模式:它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果对象存在就不再创建,直接返回。
#include <iostream>
/** 单例模式类
* by @BigoSprite 2016/06/19
*/
class Singleton{
public:
static Singleton *GetInstance(){
if (_instance == nullptr){
_instance = new Singleton();
}
// 测试日志
std::cout << "GetInstance()" << std::endl;
return _instance;
}// 公有静态方法,获取实例
private:
Singleton(){}// 构造方法private或者protected
static Singleton *_instance;// 静态实例变量
};
Singleton * Singleton::_instance = nullptr;
void main(){
Singleton *singleton = Singleton::GetInstance();// = new Singleton();// WRONG!!!
std::cin.get();
}
(2)饿汉模式:在类加载的时候就立即创建对象,不需要像懒汉模式那样需要先判断类对象是否存在,然后再决定是创建还是直接返回。
#include <iostream>
/** 单例模式类
* by @BigoSprite 2016/06/19
*/
class Singleton{
public:
static Singleton *GetInstance(){
return _instance;
}
private:
static Singleton *_instance;
Singleton(){}
};
// C++静态变量要在类外实现
Singleton* Singleton::_instance = new Singleton();
void main(){
Singleton *singleton = Singleton::GetInstance();// = new Singleton();// WRONG!!!
std::cin.get();
}
以上两种方式是单例模式最简单的两种,但是这种实现方式有时候会有问题,比如:在多线程情况下,我们需要创建多个Singleton。下面对代码进行改善,考虑多线程的单例模式:
(3)考虑多线程的单例模式
待续...
待续...