今天为大家介绍一个使用很频繁的设计模式----------单例设计模式
顾名思义单例设计模式 就是保持类只有一个实例,并且提供全局的访问接口。
一般作用于一些只具有唯一性的系统组件,如配置文件等
那么如何保持类的唯一性呢,就是不允许实例化,那么将他的构造方法设置为私有化就可以了。
/**
*
*/
package com.model.singleton;
/**
* @author Administrator
* 单例设计模式
*/
public class Singleton {
/**第一种实现方法**/
/**
* 设置静态字段保证程序运行时就载入
* 自己内部初始化自己然后私有化构造函数
* 只提供共有的get方法
* 优点反应速度快
* 缺点多线程可能造成多个实例
*/
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
/**第二种实现方法*/
/**
* 同样私有化构造函数创建静态变量
* 但在工厂方法调用时才加载类并且加入同步锁
* 优点:不会因为多线程而多次加载造成多个实例
* 缺点:反应速度慢
*/
private static Singleton instance1 = null;
public static synchronized Singleton getInstance1() {
if(instance1 == null){
instance1 = new Singleton();
}
return instance1;
}
/**单粒的第三种形式*/
public static final Singleton SINGLETON = new Singleton();
private Singleton(){
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
但是我们可以看出上面的单例模式的失去了多态性。
GOF种认为用注册表的方式来实现是最好的一种方式。
/**
*
*/
package com.model.singleton;
import java.util.HashMap;
/**
* @author Administrator
*单例模式注册表实现方式
*/
public class SingletonMap {
private static HashMap sinRegistry = new HashMap();
private static SingletonMap s = new SingletonMap();
//建立受保护的构造方法可以让子类继承并重写
protected SingletonMap() {
}
public static SingletonMap getInstance(String className){
if(className == null)
className = "Singleton";
if(sinRegistry.get(className)==null){
try {
sinRegistry.put(className, Class.forName(className).newInstance());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return (SingletonMap) sinRegistry.get(className);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
/**
*
*/
package com.model.singleton;
/**
* @author Administrator
*
*/
public class SingletonMapChildren extends SingletonMap {
public SingletonMapChildren(){
}
static public SingletonMapChildren getInstance(){
return (SingletonMapChildren) SingletonMap.getInstance("SingletonMapChildren");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}