本文简要介绍了一种创建性模型Singleton。
19 throw new SingletonException("Only one instance allowed");
20
21 else
22
23 instance_flag = true; // set flag for 1 instance
24
25 }
26
27 }
28
29 // 测试类
30
31 public class singletonTest {
32
33 static public void main(String argv[]) {
34
35 Singleton s1, s2;
36
37 // create one incetance--this should always work
38
39 System.out.println("Creating one instance");
40
41 try {
42
43 s1 = new Singleton();
44
45 } catch (SingletonException e) {
46
47 System.out.println(e.getMessage());
48
49 }
50
51 // try to create another spooler --should fail
52
53 System.out.println("Creating two instance");
54
55 try {
56
57 s2 = new Singleton();
58
59 } catch (SingletonException e) {
60
61 System.out.println(e.getMessage());
62
63 }
64
65 }
66
67 }
68
69
singletonTest运行结果是:
Creating one instance
Creating two instance
Only one instance allowed
可以看出,第一个实例顺利创建,第二个实例创建实抛出了我们自定义的异常.
三. 用注册器机制来创建
Singleton 首先用集合中的Hashtable 和Enumeration来实现addItem(Object key, Object value),getItem(Object key), ,removeItem(Object key)等方法实现一个管理器,将key和value一一关联起来,客户程序员创建实例前首先用addItem方法进行注册,再用getItem方法获取实例.Hashtable中的key是唯一的,从而保证创建的实例是唯一的,具体实现限于篇幅不再细说,在Prototype模型的应用一文中我将会给出一个实现注册器的代码.用注册器机制来创建 Singleton模式的好处是易于管理,可以同时控制多个不同类型的Singleton 实例.
小结
Singleton模式可以方便的进行扩充,产生指定数目的实例.
在The Design Patterns Java Companion 一书中曾提到过用静态类的方式来实现 Singleton模式,并指出java.lang.Math就是一个例子,这里我并不表示赞同,因为Math并不是一个真正的对象,我们只是直接调用 Math类所包装的静态方法而已,根本就没有创建实例的过程,又从何说起只产生一个实例呢?这个问题我曾到Javaranch的论坛上发过帖子,所有回帖的人也都是对这一观点持否定态度.
在多线程的程序中,singleton可能会变的不可靠,可能会出现多个实例,解决的办法很简单,加个同步修饰符: public static synchronized Singleton getInstance(). 这样就保证了线程的安全性.
最后要说的是大家可能会看见一些其他实现Singleton模式的方法,因为模式在具体的应用时是灵活的,不是一成不变的,并没有一个固定的做法,但大都是上面几种方法的变形.
3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.com/exam/