1. 定义
单例模式是对象的创建模式的一种,它保证一个类有且只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类则称为单例类。
2. 使用场合
简而言之,就是任何只需要一个实例的地方.例如,窗口管理器,假脱机打印设备,数据库连接池。具体应用中,配置信息类,管理类,控制类,门面类,代理类通常被设计为单例类.
3. 单例模式在java中的实现
单例模式在Java语言的实现上有三种情况:饿汉式单例类,懒汉式单例类,登记式单例类。
1) 饿汉式单例类
饿汉式单例类饿汉式单例类是在Java 语言里实现得最为简便的单例类。在类被加载时,就会将自己实例化。
JAVA代码:
public class Singleton{
//私有的构造方法
private Singleton(){}
//注意此处是private的
private static Singleton theInstance=new Singleton();
//这里提供供外部访问本class静态的方法,可以直接访问
public static Singleton getInstance(){
return theInstance;
}
}
2) 懒汉式单例类
与饿汉式单例类不同的是,懒汉式单例类在第一次被引用时将自己实例化。
【JAVA代码】:
public class Singleton { //定义Singleton的静态引用
public static Singleton theInstance = null;//构造方法为私有,不能在外部直接调用创建实例
private Singleton(){} //提供公共的静态的、同步的方法,获取Singleton的实例
public synchronized static Singleton instance(){
if(theInstance == null){
return new Singleton();
}
return theInstance;
}
}
3) 登记式单例类 登记式单例类是为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。
JAVA代码:
package com.javapatterns.singleton.demos;
import java.util.*;
public class RegSingleton {
//静态的私有HashMap对象
static private HashMap m_registry = new HashMap();
//静态块,类加载时运行
static { //实例RegSingleton对象 RegSingleton x = new RegSingleton();
//将其存贮在map集合中 m_registry.put(x.getClass().getName(), x);
}
//受保护的构造方法,子类可以调用。
protected RegSingleton(){
}
//公共的静态方法,返回该类的实例
static public RegSingleton getInstance(String name) {
if (name == null) {
name = "com.javapatterns.singleton.demos.RegSingleton";
}
if (m_registry.get(name) == null) {
try {
// Class.forName(name).newInstance()通过类名得到类的实例
m_registry.put(name, Class.forName(name).newInstance());
}
catch (Exception e) {
System.out.println("Error happened.");
}
}
return (RegSingleton) (m_registry.get(name));
}
}