设计模式——单例模式 Singleton

来源:互联网 发布:沈颢事件知乎 编辑:程序博客网 时间:2024/04/28 17:42

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或者protectedstatic 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)考虑多线程的单例模式

待续...



两篇很不错的单例模式的博客:

设计模式学习笔记-单例模式 和 C++设计模式——单例模式

Cocos2d-x经常使用的单例模式





0 0
原创粉丝点击