ingleton 是一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点。对一些类来说,保证只有一个实例是很重要的,
作者:中国IT实验室 来源:中国IT实验室 2007年8月26日
关键字:
二、以静态变量为标志实现 Singleton
在类中嵌入一个静态变量做为标志,每次都在进入构造器的时候进行检查。
问题在于构造器没有返回类型,如果确定创建一个实例成功与否。一个方法是调用一个函数来检查创建是否成功,然后简单的返回一个来自静态变量的值,但是这样做是不优雅的,而且容易发生错误。比较好的做法是创建一个当创建了一个以上的实例时可以抛出异常的类,这个类仅仅是调用父类方法,好处是用了自己命名的异常类型,错误信息更加清晰:
class SingletonException extends RuntimeException
{
public SingletonException(String s)
{
super(s);
}
}
class Singleton
{
static boolean instance_flag = false;
// true if 1 instance
public Singleton()
{
if (instance_flag)
throw new SingletonException
("Only one instance allowed");
else
instance_flag = true;
// set flag for 1 instance
}
}
// 测试类
public class singletonTest
{
static public void main(String argv[])
{
Singleton s1, s2;
// create one
incetance--this should always work
System。out.println
("Creating one instance");
try {
s1 = new Singleton();
} catch (SingletonException e)
{
System.out.println(e.getMessage());
}
// try to create another
spooler --should fail
System.out.println
("Creating two instance");
try {
s2 = new Singleton();
} catch (SingletonException e)
{
System.out.println(e.getMessage());
}
}
}
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 实例。