首页 > 代码库 > 单例模式
单例模式
单例模式是设计模式中最简单的形式之一。Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
一般Singleton模式通常有三种形式:
第一种形式:懒汉式,也是常用的形式。
在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。
1 public class SingletonClass{ 2 private static SingletonClass instance=null; 3 public static SingletonClass getInstance(){ 4 if(instance==null){ 5 synchronized(SingletonClass.class){ 6 if(instance==null) 7 instance=new SingletonClass(); 8 } 9 }10 return instance;11 }12 private SingletonClass(){13 }14 }
第二种形式:饿汉式。
1 public static class Singleton{ 2 //在自己内部定义自己的一个实例,只供内部调用 3 private static final Singleton instance=new Singleton(); 4 private Singleton(){ 5 //dosomething 6 } 7 //这里提供了一个供外部访问本class的静态方法,可以直接访问 8 public static Singleton getInstance(){ 9 return instance;10 }11 }
第三种形式: 双重锁的形式。
这个单例实际上维护的是一组单例类的实例,将这些实例存放在一个Map(登记薄)中,对于已经登记过的实例,则从工厂直接返回,对于没有登记的,则先登记,而后返回。
1 public static class Singleton{ 2 private static Singleton instance=null; 3 private Singleton(){ 4 //dosomething 5 } 6 public static Singleton getInstance(){ 7 if(instance==null){ 8 synchronized(Singleton.class){ 9 if(null==instance){10 instance=new Singleton();11 }12 }13 }14 return instance;15 }16 }
//这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。
1 public enum Singleton {2 INSTANCE;3 public void whateverMethod() {4 }5 }
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
http://devbean.blog.51cto.com/448512/203501/
单例模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。