首页 > 代码库 > 单例模式

单例模式

 

    单例模式是设计模式中最简单的形式之一。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/

单例模式