登記式單例模式(registry singleton)
單例類文件StudentSingleton.java
package comd.dou361.singleton;
import java.util.HashMap;
import java.util.Map;
/**
* @author Admin
*登記式單例模式
*/
public class StudentSingleton {
private static Map<String,StudentSingleton> map = new HashMap<String,StudentSingleton>();
static {
StudentSingleton studentSingleton = new StudentSingleton();
map.put(studentSingleton.getClass().getName(), studentSingleton);
}
protected StudentSingleton() {}
public static StudentSingleton getInstance(String name) {
if(name == null) {
name = StudentSingleton.class.getName();;
}
if(map.get(name) == null) {
try {
map.put(name, (StudentSingleton) Class.forName(name).newInstance());
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException e) {
e.printStackTrace();
}
}
return map.get(name);
}
//一個示意性的商業方法
public String about() {
return "Hello, I am studentSingleton.";
}
}
沒有意義的繼承ChildSingleton.java
package com.dou361.singletonchild;
import comd.dou361.singleton.StudentSingleton;
public class ChildSingleton extends StudentSingleton {
}
測試類文件Test.java
package comd.dou361.test;
import com.dou361.singletonchild.ChildSingleton;
import comd.dou361.singleton.StudentSingleton;
public class Text {
public static void main(String[] args) {
StudentSingleton studentSingleton = StudentSingleton.getInstance(null);
System.out.println(studentSingleton.about());
//定義一個子類繼承一個單例類,只能使用多態,不能強制
//下面的單例使用沒有意義
StudentSingleton singleton = ChildSingleton.getInstance(null);
System.out.println(singleton.about());
}
}