Java单例模式Singleton

原创 2012年03月29日 17:07:52

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(). 这样就保证了线程的安全性.


相关文章推荐

java Singleton单例模式

  • 2010年06月21日 09:07
  • 59KB
  • 下载

单例模式Singleton(java源码)

  • 2011年03月30日 21:33
  • 409B
  • 下载

Java 写一个单例模式(Singleton)出来

第一种:饱汉模式 public class SingleTon {  private SingleTon(){ } //实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间 ...
  • zpf336
  • zpf336
  • 2014年09月25日 21:41
  • 6786

Java 单例模式Singleton

  • 2011年01月08日 21:27
  • 1KB
  • 下载

java 单例模式(Singleton)

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处: 1、某些类创建比较频繁,对于一些大型的对象,这是一...

java 单例模式 (Singleton)

概要  单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(c...

Java 单例模式(Singleton Mode)

java模式之单例模式:           单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。  特点:        1,一个类只能有一个实例        2,自...

JAVA单例模式(Singleton)

单例模式主要用于:有一些对象我们只需要一个,比如:线程池、缓存、对话框、处理偏好设置、注册表对象、日志对象以及配置文件对象、数据库连接对象等等。单例模式常用于管理共享资源,例如:数据库连接或者线程池。...

Singleton单例模式-如何防止JAVA反射对单例类的攻击?

在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式 (2).懒汉式(、加同步锁的懒汉式、加双重校验锁的懒汉式、防止指令重排优化的懒汉式) (3).登记式单例模式 (4).静...
  • hl_java
  • hl_java
  • 2017年05月09日 21:06
  • 137

单例模式(java 实现 Singleton)(二)

上一篇单例模式(一)中讲述了单例模式的基本思想和原理,后来又看到不同的单例模式的实现方式,产生了疑问。 以下是网上搜到的比较具体和清晰的回答,对于单例模式的几种实现方式做了比较细致的讲解,转载来方便...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java单例模式Singleton
举报原因:
原因补充:

(最多只允许输入30个字)