一、特性与定义
1.?定义
? ? ? ? 在有些系统中,为了节省内存资源,保证数据内容的一致性,对某些类要求只能创立一个实例,这就是单例模式(指一个类只有一个实例,且它能自行创立这个实例的一种模式)。例如Windows系统只能打开一个任务管理器,这样能够避免因打开多个任务管理器窗口而造成内存资源的白费,或者多个窗口显示内容不一致的情况。
2.?特点
? ? ?1).?单例模式只有一个实例对象;
? ? ?2).?该单例对象必需由单例类自行创立;
? ? ?3).?单例类对外提供一个访问该单例的全局访问点。
? ? ?单例类中包含用自身公告的类变量,这个类变量是单例类唯一的实例。单例类的构造方法访问权限必需是private, 这样一来,其它任何类都无法自己调用单例类的构造方法来创立对象。所以单例类自己需要提供一个创立实例的方法,并且限制只能够创立一个实例,所以其它类也只能通过调用这个方法来创立唯一的单例类实例。
单例模式原理图
二、实现
1.?懒汉模式
? ? 由于只有在使用到它的时候才去创立实例,故叫此名。
public class Singleton {
? ? private static Singleton uniqueInstance;? ? //唯一的对象
? ? private Singleton() {}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //构造方法
? ? public static synchronized Singleton getInstance() {
? ? ? ? ? ? if (uniqueInstance == null) {
? ? ? ? ? ????? uniqueInstance = new Singleton();
????????? ? }
? ? }
}
getInstance方法中,假如不使用syschronized关键字,在高并发时可能会创立多个Singleton实例,这样违反了单例模式的准则。
? ? 此种方法由于使用了syschronized关键字,所以会降低使用效率。
2.?饿汉模式
? ? 不论能否需要这个实例,我在类加载时都去创立它,故叫此名。
public class Singleton {
? ? private static Singleton uniqueInstance = new Singlegon();
? ? private Singleton() {}
? ? public static Singleton getInstance() {
? ? ? ? return uniqueInstance;
? ? }
}
? ? 此种方式效率较高,但是假如我后面都不会使用到这个实例,那么这样的做法就会白费资源,.
3.?使用静态内部类的方式(推荐)
public class Singleton {
? ? public static class InnerSingleton {
? ? ? ? ?public static Singleton singleton = new InnerSingleton()
? ? }
? ? public static Singleton getInstance() {
? ? ? ? return InnerSingleton.singleton;
? ? }
}
? ? 当调用getInstance()方法时,会调用静态内部类获取唯一实例,当再次调用getInstance()方法时,由于静态内部类是静态的,所以只能被实例化一次,所以每次都会返回唯一的实例。