单体模式探讨(原创)

04-03-12 tbase
    

Singleton模式定义:单体模式既从全局的观点看只有一个对象。

    值得注意的是如果你的Singleton继承自 Object,你可以不用考虑clone函数的问题,因为它是protected的,但是如果你是从某个有public
的clone函数对象继承来的单体对象,你应该重载 clone函数并抛出CloneNotSupportedException错误。

    另外,还有一个lazy initialization的问题,有些同行喜欢lazy initialization,那么一定要注意需要使用synchronized。否则,
有可能获得多个实例
<p>

//: 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>

    最后,我们可以由单体模式引申出一个对象池的问题的,不是一个对象,而是只有最多N个对象的问题。这个也就是对象池,可以看作是单体对象的
一个变化。
<p>

    

banq
2004-03-14 10:59

是的,就是Pool, 常用的有数据库连接池、还有对象池,后者一般是提升性能的主要手段。