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的几种模式

Singleton的4种实现方式1.静态工厂实现法静态工场估计是最常用的单例实现方式,例子如下(详细见注解)// 静态工厂实现法 public class CommonSingleton { /...
  • u012233832
  • u012233832
  • 2016年08月08日 23:37
  • 390

浅谈JAVA设计模式之——单例模式(Singleton)

一、概述        保证一个类仅有一个实例,并提供一个访问它的全局访问点。 二、适用性      1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。      2.当这个唯一...
  • l1028386804
  • l1028386804
  • 2015年05月02日 17:50
  • 1085

JAVA的单例模式(用java写一个singleton的例子)。

代码如下: package test; public class SingleObject { // 创建 SingleObject 的一个对象 private static ...
  • suyu_yuan
  • suyu_yuan
  • 2016年08月18日 12:58
  • 3267

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

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

C#设计模式——单例模式(Singleton)

一、引言 最近在设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深...
  • ycl295644
  • ycl295644
  • 2015年07月06日 08:53
  • 2114

Objective-C 中singleton(单例模式)的实现

OC中的单例很有意思,因为
  • dfqin
  • dfqin
  • 2014年09月25日 22:26
  • 4330

java 单例模式及运用

定义: 确保某一个类只有一个实例,而且自动实例化并向整个系统提供这个实例。 代码: Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产...
  • qilixiang012
  • qilixiang012
  • 2015年01月22日 16:10
  • 873

【Singleton】单例模式及常见的6种写法—宁可饥饿也不偷懒

单例模式大家并不陌生,分为懒汉式、饿汉式之类的。它们是有些细微的不同,下面就一点一点告诉你们这俩汉子有嘛不同   下面是一个简单的小实例: //简单懒汉式 public class Singleton...
  • knockheart
  • knockheart
  • 2013年06月19日 11:46
  • 2880

muduo库源码解析:单例模式singleton

单例模式实现 boost::noncopyable 防止复制,如果是自己实现,那要把构造函数、拷贝构造,复制构造都私有 公有方法: 获取单例对象:instance() 返回 value 引用,(第一次...
  • le119126
  • le119126
  • 2015年12月12日 17:09
  • 812

如何创建线程安全的单例模式?线程安全的Singleton!

单例模式的概念 单例模式就是确保只有一个实例,而且自行实例化并向整个系统传递这个实例,这个类就称作为单例类 单例模式最重要的一个特点就是构造方法私有化。创建单例模式分为懒汉式和饿汉式。 ...
  • a347911
  • a347911
  • 2016年11月24日 16:59
  • 1436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java单例模式Singleton
举报原因:
原因补充:

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