單體模式探討(原創)

tbase發表於2004-03-12
Singleton模式定義:單體模式既從全域性的觀點看只有一個物件。

    值得注意的是如果你的Singleton繼承自 Object,你可以不用考慮clone函式的問題,因為它是protected的,但是如果你是從某個有public
的clone函式物件繼承來的單體物件,你應該過載 clone函式並丟擲CloneNotSupportedException錯誤。

    另外,還有一個lazy initialization的問題,有些同行喜歡lazy initialization,那麼一定要注意需要使用synchronized。否則,
有可能獲得多個例項
<p class="indent">


//: singleton:SingletonPattern.java
import junit.framework.*;

 final class Singleton {
  private static Singleton s = new Singleton(47);
  private int i;
  private Singleton(int x) { i = x; }
  public static Singleton getReference() { 
    return s; 
  }
  public int getValue() { return i; }
  public void setValue(int x) { i = x; }
}
 public class SingletonPattern extends TestCase {
  public void test() {
    Singleton s = Singleton.getReference();
    String result = "" + s.getValue();
    System.out.println(result);
    assertEquals(result, "47");
    Singleton s2 = Singleton.getReference();
    s2.setValue(9);
    result = "" + s.getValue();
    System.out.println(result);
    assertEquals(result, "9");
    try {
      // Can't do this: compile-time error.
      // Singleton s3 = (Singleton)s2.clone();
    } catch(Exception e) {
      throw new RuntimeException(e);
    }
  }
  public static void main(String[] args) {
    junit.textui.TestRunner.run(SingletonPattern.class);
  }
} ///:~
<p class="indent">

    最後,我們可以由單體模式引申出一個物件池的問題的,不是一個物件,而是隻有最多N個物件的問題。這個也就是物件池,可以看作是單體物件的
一個變化。
<p class="indent">

相關文章