設計模式案例--單例模式--登記式單例模式(registry singleton)

登記式單例模式(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());
	    
	    
	    
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章