目录
[显示]

1.摘要

Singleton模式能保证系统运行时的某个类仅有一个实例,虽然模式思路很简单,但实现方法的不同有可能造成正确性或效率的问题,需要额外注意。

2. 针对问题

系统运行时的某个类仅有一个实例的情况。

3. 介绍

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

4. 实现

4.1. 单线程

一般Singleton的实现分为3部分。
1、隐藏构造函数
2、创建并保存实例
3、返回实例

例子如下:

 

4.2. 多线程

多线程环境下,多个线程同时执行创建并保存实例有可能冲突并产生多个实例。
解决方法主要有三种:
1、线程同步,主要分为一次判断和二次判断
一次判断:判断语句包含在同步区域内,如下:

代码执行效率受同步影响较大。

二次判断:进入同步区域前进行一次判断,如下:

曾经在网上看过一篇文章,讲二次判断仍然不能完全保证逻辑的正确性,但是一般情况下不会出现。

2、利用语言特性初始化,由编译器确定构造函数执行时间。

还有一些类似方法,函数内static变量赋值,放入static区,构造static类,构造enum项等,思路大致类似。构造函数执行时间较长时会拖慢程序载入速度。

3、手工初始化
进入多线程状态前预先进行初始化,可以与二次判断合用。

5. 特点

1、设计模式思路简单
2、实现方式多样,需要按需挑选合适方式。

6. 相关文章

设计模式总结

7. 参考文章

  1. 《设计模式_可复用面向对象软件的基础》
  2. http://blog.csdn.net/hguisu/article/details/7505909