单例模式,顾名思义,就是指一个类存在一个实例。例如我们的Windows 上的垃圾回收站,任务管理器,无论启动多少次都只有一个实例。
单例模式是Java设计模式中最常见的一种设计模式。单例模式因为只生成一个实例,减少了内存占用和系统开销。当一个对象的产生需要比较多的资源时,如:读取配置,产生其他依赖对象时,可以通过在应用启动时直接产生一个单例对象,然后永久驻留在内存中。
常用的设计模式有两种,一种是饿汉式,懒汉式,还有双重检测锁,静态内部类,枚举式。
饿汉式常用,线程安全,效率高,但是不能延时加载。
`
public class SingleTon01 {
private static SingleTon01 s=new SingleTon01();//s为私有化静态属性
//将构造器私有化,外部不能构造Singleton对象
private SingleTon01(){
}
//外部调用的方法,不管什么时候调用,返回的都是s,保证了是同一个对象
public static SingleTon01 getInstance(){
return s;
}
}`
懒汉式(懒加载),效率不高,线程安全,但是能延时加载。
public class Singleton02 {
private static Singleton02 s;
private Singleton02(){
}
//等到需要实例化的时候再实例化S,加上线程锁是为了避免在多线程时出现同时实例化的状况。
public static synchronized Singleton02 getInstance(){
if (s==null) {
s=new Singleton02();
}
return s;
}
}
静态内部类
public class SingleTon03 {
//构造器私有化
private SingleTon03(){
}
//静态内部类中创建实例
private static class SingleTonInstance{
private static SingleTon03 singleTon=new SingleTon03();
}
public static SingleTon03 getIntance(){
return SingleTonInstance.singleTon;
}
}
枚举类
/**
* 枚举式
*/
public enum SingleTon04 {
INSTANCE;
public static SingleTon04 getInstance(){
return INSTANCE;
}
}
双重检测锁非常少用,因为容易发生错误,所以……
测试:
public class Client {
static SingleTon01 s10;
static SingleTon01 s11;
static Singleton02 s20;
static Singleton02 s21;
static SingleTon04 s40;
static SingleTon04 s41;
static SingleTon03 s30;
static SingleTon03 s31;
public static void main (String args[]){
s10=SingleTon01.getInstance();
s11=SingleTon01.getInstance();
s20=Singleton02.getInstance();
s21=Singleton02.getInstance();
s40=SingleTon04.getInstance();
s41=SingleTon04.getInstance();
s30=SingleTon03.getIntance();
s31=SingleTon03.getIntance();
System.out.println(s10==s11);
System.out.println(s20==s21);
System.out.println(s30==s31);
System.out.println(s40==s41);
}
}