一直对设计模式很模糊,虽然项目中运用到了,但是很难真正说清什么是设计模式。这一节主要讲的是单例设计模式
在一个类中只有一个类的实例(构造函数是私有的),这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。主要作用对象是:一个全局使用的类频繁地创建与销毁。
/** * @author xieyong * @description 单例设计模式---一个类只有一个实例 * @date 2018/5/29 16:58 * @modified by: */ public class Singleton { private static Singleton singleton; //让构造函数为 private,这样该类就不会被实例化 private Singleton(){} public static Singleton getInstance(){ if (null==singleton){ singleton=new Singleton(); } return singleton; } }
这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。
/** * @author xieyong * @description 单例设计模式---一个类只有一个实例 * @date 2018/5/29 16:58 * @modified by: */ public class Singleton { private static Singleton singleton; //让构造函数为 private,这样该类就不会被实例化 private Singleton(){} public static synchronized Singleton getInstance(){ if (null==singleton){ singleton=new Singleton(); } return singleton; } }
这种写法在getInstance()方法中加入了synchronized锁。能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是效率很低(因为锁),并且大多数情况下不需要同步。
/** * @author xieyong * @description 单例设计模式---一个类只有一个实例 * @date 2018/5/29 16:58 * @modified by: */ public class Singleton { private static Singleton singleton=new Singleton(); //让构造函数为 private,这样该类就不会被实例化 private Singleton(){} public static synchronized Singleton getInstance(){ return singleton; } }
这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,这时候初始化instance显然没有达到lazy loading的效果。
/** * @author xieyong * @description 单例设计模式---一个类只有一个实例 * @date 2018/5/29 16:58 * @modified by: */ public class Singleton { private static Singleton singleton=null; //让构造函数为 private,这样该类就不会被实例化 private Singleton(){} static { singleton=new Singleton(); } public static synchronized Singleton getInstance(){ return singleton; } }
文章来源: 单例设计模式