簡單工廠模式+反射機制
阿新 • • 發佈:2019-01-23
一、首先建立一個程式語言的介面 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----