1. 程式人生 > >簡單工廠模式+反射機制

簡單工廠模式+反射機制

一、首先建立一個程式語言的介面 LanguageInterface

package com.design.factory;

/**
 * 程式語言介面
 * @author Administrator
 *
 */
public interface LanguageInterface {

	//具體語言型別
	public void useType();

}

二、然後建立兩個具體的程式語言(CType、JavaType)實現該介面

package com.design.factory;

public class CType implements LanguageInterface {

	@Override
	public void useType() {
		System.out.println("----C語言----");
	}

}
package com.design.factory;

public class JavaType implements LanguageInterface{

	@Override
	public void useType() {
		System.out.println("----Java----");
	}

}

三、接著建立一個language.properties檔案用來對映具體語言的路徑

c=com.design.factory.CType
java=com.design.factory.JavaType

四、再建立一個properties檔案讀取工具ReaderProperties

package com.design.factory;

import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 程式語言讀取工具
 * @author Administrator
 *
 */
public class ReaderProperties {

	public Map<String, String> getPropertyAndKey(){
		Map<String, String> map = new HashMap<String, String>();
		
		Properties pt = new Properties();
		try {
			//讀取對映檔案
			InputStream in = getClass().getResourceAsStream("language.properties");
			//從輸入流讀取屬性列表(鍵和元素對)
			pt.load(in);
			//返回屬性列表所有鍵的列舉
			Enumeration<?> en = pt.propertyNames();
			//逐行讀取列舉的key和value並存放在map中
			while(en.hasMoreElements()){
				String key = (String)en.nextElement();
				String value = pt.getProperty(key);
				map.put(key, value);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}
}

五、還有就是我們的工廠類LanguageFactory

package com.design.factory;

import java.util.Map;

/**
 * 程式語言工廠
 * @author Administrator
 *
 */
public class LanguageFactory {

	public LanguageInterface getLanguageTypeByKey(String key){
		try {
			//獲取language.properties檔案的屬性列表
			Map<String, String> map = new ReaderProperties().getPropertyAndKey();
			//通過對映找到對應的類
			LanguageInterface li = (LanguageInterface)Class.forName(map.get(key)).newInstance();
			
			return li;
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}
}

六、最後就是測試

package com.design.factory;

/**
 * 測試
 * @author Administrator
 *
 */
public class TestFactory {


	public static void main(String[] args){
		LanguageFactory lf = new LanguageFactory();
		lf.getLanguageTypeByKey("c").useType();
	}
	
}

測試結果為

----C語言----

:使用反射的目的就是為了規避工廠中使用switch case 或if else 判斷,而且如果有什麼需要新加的產品也無需修改工廠類,只需新加一個產品類實現產品介面,再修改一下properties檔案就可以做到。

下面我們新加一個PythonType

package com.design.factory;

public class PythonType implements LanguageInterface {

	@Override
	public void useType() {
		System.out.println("----Python----");
	}
}

再修改一下language.properties檔案

c=com.design.factory.CType
java=com.design.factory.JavaType
python=com.design.factory.PythonType

然後測試一下

package com.design.factory;

/**
 * 測試
 * @author Administrator
 *
 */
public class TestFactory {

	public static void main(String[] args){
		LanguageFactory lf = new LanguageFactory();
		lf.getLanguageTypeByKey("python").useType();
	}
	
}

執行結果:

----Python----