写完了前面两篇,接下来,写一下《研磨设计模式》里面独特的地方。

     对于前面的单例设计模式的实现,可以分为两类:懒汉模式(代码中的,1,3,4),跟饿汉模式(代码中的2)。

    懒汉:顾名思义,就是什么事都不提前做,等到紧要关头才做。

以 4为例:

(4)且看如下代码:

   public class Singleton{

    public static Singleton single = null;

   //--老生常谈了,第一步,私有化构造方法--

  private Singleton(){}

  //--第二步,提供一个获得该类实例的方法--

public static Singleton getInstance(){

   if(null == single){   //-----第一重判断--

   synchronized( Singleton.class){

   if( null == single ){  //---第二重判断--

     single = new Singleton();

}

}

  return single;

}

}

}

对于静态变量,single,不先对它进行人为的初始化。当系统要获得一个该类的实例时,才在 getInstance 方法里进行创建。

但这种方法的好处是,通过初始化类时,节省的空间,即以时间换取了空间。

        而对于饿汉:即因为饿,所以不管怎么样,他总是把可以做的,可以“吃”的都先搞定。

以2为例:

(2)且看如下代码:

  public class Singleton{

    public static Singleton single = new Singleton(); //--第二步,创建一个单例类的实例

   //--同样,第一步,私有化构造方法--

   private Singleton(){}

  public static Singleton getInstance(){

   return single;

}

}

在声明静态变量single时,就创建了个单例类的对象 new Singleton(),然后将single指向了它。

很明显在,JVM在加载该类里,多做了一些事。这种形式的好处是:当你想获得该类的实例时,通过getInstance方法,就能直接获得,节省创建对象的时间。即以空间换取了时间。

            到这里,单例模式算是讲得差不多了,但对于一些挑剔者,对于前面的“懒汉模式”的性能有点质疑,即在多线程环境里,当多个线程调用getInstance,要进行人为同步,浪费了时间。那么有没有这样一种,既符合“懒汉模式”,又有更高的效率的呢?

(网络上牛人就是多,通过静态内部类的实现形式)(5)且看如下代码:

public class Singleton{

public static class innerClass{

public static Singleton single = new Singleton();

}

private Singleton(){}  //--第一步,你懂的

public static Singleton getInstance(){  //--第二步,获取实例--

    return innerClass.single;

}

}

至于,这种内部类的形式,如何能够达到这种效果,则取决于JVM在加载类时的同步知识了。

    个人总结:感觉这三篇博文写得不是很有逻辑,如果有读者对我的笔记不是很理解,请参见《研磨设计模式》里的“单例模式”章节,谢谢大家!