一、什么是单例
一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法static,通常使用getInstance这个名称);
当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;
同时我们还将该类的构造方法 定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
二、单例特点
某个类只能有一个实例
它必须自行创建这个实例
它必须自行向整个系统提供这个实例
两种实现方式: 饿汉式 与 懒汉式
三、Java实现单例特点:
构造器是私有的,因此,类不能被继承。(符合单例类要点 第一条 :某个类只能有一个实例)
都是通过调用单例类的方法,获取单例类的对象,怎么实例化单例由单例类操作(符合单例类要点 第二条 :它必须自行向整个系统提供这个事例)
四、单例有两种实现方式
懒汉式:
/* 单例 懒汉式单例类 */ public final class LazySingleton{ private static LazySingleton mInstance = null; private LazySingleton() {} // 私有的默认构造器,保证外界无法直接实例化 /** * 静态工厂方法,返还此类的唯一事例 */ public synchronized static LazySingleton getInstance(){ if (mInstance == null){ mInstance = new LazySingleton(); } return mInstance; } }
懒汉式
懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器在实例化时必须涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的几率变得较大。
饿汉式:
/* 单例 饿汉式单例类 1.某个类只能有一个实例 2.它必须自行创建这个事例 静态变量 m_instance()会被初始化,此时累的私有构造器会被调用 3.它必须自行向整个系统提供这个事例 */ public class EagerSingleton{ private static final EagerSingleton mInstance = new EagerSingleton(); private EagerSingleton() {} // 私有的默认构造器,保证外界无法直接实例化 /* * 静态工厂方法 */ public static EagerSingleton getInstance(){ return mInstance; } }
五、饿汉与懒汉的区别
1. 资源利用方面
饿汉式因为构造器是只要类被加载就实例化。比懒汉式差些。
2. 速度和反应时间方面
饿汉式比懒汉式好些
单例类要点 第二条 :自己必须自行创建这个事例
自己被加载时就将自己实例化。(static final )
在类方法被调用的时候,才初始化 (static 返回时判断是否未初始化 )
2014-01-31 增加文字描述