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;
}
}
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{
/**
* @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
}
}
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 SingletonException(String s) {
super(s);
}
}
public class TextSingleton {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton s1, s2;/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 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 单例模式
- java Singleton 单例模式
- java单例模式(Singleton)
- Java单例模式Singleton
- Java Singleton 单例模式
- [java]单例模式Singleton
- java 单例模式 (Singleton)
- Java Singleton 单例模式
- Java单例模式(singleton)
- Java单例模式(Singleton)
- Java singleton单例模式
- java Singleton单例模式
- java单例模式 Singleton
- Java Singleton单例模式
- java singleton单例模式
- Java singleton(单例模式)
- java设计模式---singleton---单例模式
- Java单例模式浅析 (Singleton模式)
- 使用jsfl批量生成fla文件(文件是在多个文件夹下)如果是单个文件夹下也可以
- oracle与java类型对照 (仅供参考)
- typedef和define的区别
- 驱动开发中的TYPE_ALIGNMENT问题
- Js获取当前日期时间及其它操作
- Java单例模式Singleton
- 实现Path2.0中绚丽的的旋转菜单
- Delphi 使用笔记
- Linux程序设计——文件操作(底层文件访问)
- Java I/O总结——OutputStream
- 这是一个从网上找到的类,我只会把它当成方法使用,如果用类不知怎么用,先记下来
- java 得到百分比
- 【PHP】date函数 运行和自己电脑时间不一样
- extjs EditorGridPanel禁止某些单元格编辑