值得注意的是如果你的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>
猜你喜欢
本站原创《复杂软件设计之道:领域驱动设计全面解析与实战》