单例模式算是一种接触比较多的一种模式,像Spring中的BeanFactory就是应用的单例模式。单例模式的类,只能创建一个实例,通常单例模式有如下3中实现。
1、饿汉模式
饿汉模式,每次类加载的时候就会主动创建一个实例,,私有构造方法不能被继承
/**
* 饿汉式单例
* */
public class MySingleton {
private static MySingleton mySingleton=new MySingleton();
private MySingleton(){}
public static MySingleton getInstance(){
return mySingleton;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "饿汉式单例";
}
}
2、懒汉模式
懒汉模式,只有被调用,才会创建唯一实例,私有构造方法不能被继承
/**
* 懒汉式单例
* */
public class MySingleton2 {
private static MySingleton2 mySingleton2;
private MySingleton2(){}
public static synchronized MySingleton2 getInstance(){
if(mySingleton2==null){
mySingleton2=new MySingleton2();
}
return mySingleton2;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "懒汉式单例";
}
}
3、单例注册表
单例注册表克服了,饿汉式和懒汉式单例中类不能被继承的缺点。
public class MySingleton3 {
private static Map register=new HashMap();
//静态代码块,类加载时自动执行
static{
MySingleton3 mySingleton3=new MySingleton3();
register.put(mySingleton3.getClass().getName(), mySingleton3);
}
//受保护的构造函数,如果为继承关系则可以调用,克服了单例类不能被继承的缺点
protected MySingleton3() { }
public static MySingleton3 getInstance(String name){
if(name==null){
name="MySingleton3";
}
if(register.get(name)==null){
try {
register.put(name, Class.forName(name).newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
return (MySingleton3)register.get(name);
}
@Override
public String toString() {
return "单例注册表";
}
}
测试
public class TestSingleton {
public static void main(String[] args) {
System.out.println(MySingleton.getInstance());
System.out.println(MySingleton2.getInstance());
System.out.println(MySingleton3.getInstance("MySingleton3"));
}
}
输出:
饿汉式单例
懒汉式单例
单例注册表