什么是单例模式
单例模式是一种常用的软件设计模式。 在它的核心结构中只包含一个被称为单例类的特殊类。 通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。 如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
单例模式使用场景
有一些对象我们只需要一个,如:线程池、缓存、对话框、处理偏好设置、注册表的对象、日志对象、相机等。 实际上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生。
设计步骤
- 三个步骤
1.构造器设置为私有的,这样外部就不能创建其对象 2.声明一个私有静态的对象 3.创建公开的静态方法返回该对象给外部
- 类图
设计方法与实例分析
- 两种单例模式
懒汉式-使用时才创建对象
饿汉式-声明时就创建好对象
- 懒汉式
方式1:不使用多线程时可用
class Camera { private static Camera mCamera = null; private Camera() {} public static Camera getInstance() { if (mCamera == null) { //如果使用了多线程,此处仍然有可能导致创建多个对象 mCamera = new Camera(); } return mCamera; } }
方式2:使用了多线程时可用,但效率会降低100倍
class Camera { private static Camera mCamera = null; private Camera() {} public synchronized static Camera getInstance() { if (mCamera == null) { mCamera = new Camera(); } return mCamera; } }
方式3:双重检查加锁,方式2的改进版,可以提高效率
class Camera { private volatile static Camera mCamera = null; private Camera() {} public static Camera getInstance() { if (mCamera == null) { synchronized (Camera.class) { if (mCamera == null) { mCamera = new Camera(); } } } return mCamera; } }
- 饿汉式
class Camera { private static Camera mCamera = new Camera(); private Camera() {} public static Camera getInstance() { return mCamera; } }
在安卓中的使用
设计模式常常被用在框架设计中,因此安卓framework中使用了多种模式,单例模式随处可见