Java单例模式Singleton

来源:互联网 发布:淘宝上品牌折扣店真假 编辑:程序博客网 时间:2024/05/22 10:50

Singleton是一种创建性模型,它确保只产生一个实例,并提供一个访问它的全局访问点,对于有些类来说,确保只有一个实例是很重要的,比如有的时候数据库的连接、Socket连接要受到一定的限制,必须确保同一时间只有一个连接的存在。再举个例子,集合中的set中不能包含重复的元素,添加到set里的对象必须是唯一的,如果重复的添加到set,它只接受一个实例,JDK中正式运用了Singleton模式来实现set这一特性,大家可以看到java.util.Collection离得内部静态类SingletonSet的源代码。其实Singleton是最简单但是也是应用最广泛的模式之一。




为了实现Singleton模式,我们需要的是一个静态的变量,能够在不创建对象的情况下记忆是否已经产生过了实例了。静态变量或者静态方法都可以在不产生具体实例的情况下直接调用,这样的变量不会因为类的实例化而有所改变。

以下介绍两种实现 Singleton 模式的办法
一.用静态方法实现Singleton
这种方法是使用静态方法来监视实例的创建。为了防止创建一个以上的实例,我们最好把构造器声明为private,这样可以防止客户程序员通过除由我们提供的方法之外的任意方法来创建一个实例,如果不把构造器声明为private,编译器就会自作聪明的自动同步一个默认的friendly构造器。这种实现方法是最常见的:

public class Singleton {
private static Singleton s;


private Singleton() {
}


public static Singleton getInstance() {
if (s == null) {
s = new Singleton();
}
return s;
}
}


public class TextSingleton {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton singleton = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
if (singleton == singleton2) {
System.out.println("1==2");
}else{
System.out.println("1!=2");
}
}

}

TextSingleton运行的结果是:1==2

二. 以静态变量为标志实现Singleton。
在类中嵌入一个静态变量作为标志,每次在进入构造器的时候都进行检查。

做法是创建一个当创建了一个以上的实例时会抛出异常的类,这个类仅仅是调用父类方法,自己定义一个异常,可以使错误信息更加明确。

public 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 SingletonException extends RuntimeException {
public SingletonException(String s) {
super(s);
}
}

public class TextSingleton {
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
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

可以看出,第一个实例顺利创建,第二个实例创建实抛出了我们自定义的异常.


1.Singleton模式可以方便的进行扩充,产生指定数目的实例.

2.在多线程的程序中,singleton可能会变的不可靠,可能会出现多个实例,解决的办法很简单,加个同步修饰符: public static synchronized Singleton getInstance(). 这样就保证了线程的安全性.


原创粉丝点击