关于单例模式

在开发中,我们经常用到,且一定要用到的一个设计模式就是单例模式。但是想要写好用好它也不容易。

简单的单例模式

public class Student{
    private static Student mStudent=new Student();

    private Student(){
    }

    public static Student getStudent(){
        return mStudent;
    }    
}

> 这种写法最好不要。

进阶写法

 public class Student{
    private static Student instantce;

    private Student(){
    }

    public static synchronized Student getInstancce(){
        if(instantce == null){
            instance = new Student();
            }
        return mStudent;
    }    
}

> 这种相对于1肯定好很多

完善写法

public class Student{
private static Student instantce;

private Student(){
    }

public static Student getInstancce(){
    if(instantce == null){
        synchronized(Student.class){
                if(instance == null){
                    instance = new Student();
                    }
            }

        }
    return mStudent;
    }    
}

推荐写法

    public class Student {

        private Student() {

        }

        public static Student getInstance() {
            return StudentHolder.mInstance;
        }

        /**
         * 静态内部类
         */
        private static class StudentHolder {
            private static final Student mInstance = new Student();
        }


    }

> 当第一次加载Student类的时候并不会初始化mInstance,只有在第一次调用Student的getInstance()方法的时候才会导致mInstance被初始化。因此,第一次调用getInsatance方法会导致虚拟机加载StudentHolder类,这种方法保证了线程安全。和对象的唯一性。,同时也延迟了单例的实例化。

枚举单例

public enum SingletonEmun{

    INSTANCE;

    public void soSomthing(){
        System.out.println("do something");
    }
}