在菜鸟教程中的学习加上自己的理解 1、单例模式
//单例模式:一个类有且只有一个对象 public class SingleObject { //private:防止外界随意给这个属性赋值 //static:防止死循环 private static SingleObject instance = new SingleObject(); //构造方法私有化,这样该类不会被实例化 private SingleObject(){} //获取唯一可用的对象 //static:为了防止方法依赖对象而创建 public static SingleObject getInstance(){ return instance; } }1、懒汉式
//单例模式:一个类有且只有一个对象 public class SingleObject { //private:防止外界随意给这个属性赋值 //static:防止死循环 private static SingleObject instance; //构造方法私有化,这样该类不会被实例化 private SingleObject(){} //获取唯一可用的对象 //static:为了防止方法依赖对象而创建 public static SingleObject getInstance(){ if(instance == null){ instance = new SingleObject();; } return instance; } }2、饿汉式
饿汉式即为第一个例子
3、双重校验锁
//双锁机制 public class SingleObject { //为什么加volatile? //短期不出问题,超高并发下会产生数值错误 private volatile static SingleObject instance; private SingleObject (){} public static SingleObject getInstance() { if (instance == null) { //双重检查 synchronized (SingleObject.class) { if (instance == null) { instance = new SingleObject(); } } } return instance; } }4、静态内部类
public class SingleObject { //final:不能再改变其引用 private static class SingleObjectHolder { private static final SingleObject INSTANCE = new Singleton(); } private SingleObject (){} //final:不能再改变其引用 public static final SingleObject getInstance() { return SingleObjectHolder.INSTANCE; } }5、枚举
//简洁,自动支持序列化机制,绝对防止多次实例化 public enum Singleton { INSTANCE; public void whateverMethod() { } }**经验之谈:**一般情况下,不建议使用第 1 种和第 2 种懒汉方式,建议使用第 3 种饿汉方式。只有在要明确实现 lazy loading 效果时,才会使用第 5 种登记方式。如果涉及到反序列化创建对象时,可以尝试使用第 6 种枚举方式。如果有其他特殊的需求,可以考虑使用第 4 种双检锁方式。
2、工厂模式