单体模式探讨(原创)

04-03-12 tbase
    

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

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

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



//: 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);
}
}
///:~


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

    

banq
2004-03-14 10:59

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