靜態工廠方法是一種將類的運用者和產生著隔離的設計模式,它是一種創造型模式,但是它不屬於23種基本設計模式中的一種,它是理解抽象工廠的基礎 "參考yqj2065的博客" 上課時yqj2065要求:除了JDK等框架或工具中的類,自己編寫的類不得使用new創建對象(Test除外)。 據說是因為使用new會 ...
靜態工廠方法是一種將類的運用者和產生著隔離的設計模式,它是一種創造型模式,但是它不屬於23種基本設計模式中的一種,它是理解抽象工廠的基礎
[參考yqj2065的博客](http://blog.csdn.net/yqj2065/article/details/8510074)
上課時yqj2065要求:除了JDK等框架或工具中的類,自己編寫的類不得使用new創建對象(Test除外)。
據說是因為使用new會涉及到硬編碼。(不是很懂)
所以要求用<b>God</b>類利用反射+配置文件來創建對象。
下麵介紹如何創建並使用tool包中的工具類God:
1.屬性配置文件
Java程式通常處理的配置文件有兩種類型①XML格式的配置文件、②屬性配置文件(.properties文件)
屬性配置文件是一種簡單的、易解析的文件格式。該.properties文件是一個文本文件,僅包含兩種語法。
前面加有#號的行是註釋;
以“鍵=值”的方式定義一個屬性的配置信息。鍵值前後的空格在解析時候會被忽略;鍵不可以換行,值換行用“\”表示。
預設的屬性配置文件為預設包目錄下的my.properties,其內容為:
#本屬性配置文件代表從資料庫、屬性配置文件或XML文件中獲得字元串的各種技術。
#本文件用於多個程式,使用前要檢查本文件是否進行了必要的修改。
#註意:鍵必須映射類全名。
1=Test1.Cat1
2=Test1.Cat2
3=HelperMethod.Method1
2. tool.God
使用JDK中的java.util.Properties類能夠方便地處理屬性配置文件。
God類getValue(String path,String key)方法從path指定的屬性配置文件中,讀取key的值,它是God類的核心,但是對於學習設計模式而言無關緊要。
重載的create ()方法是靜態工廠。create (String path,String key)將調用getValue()方法,按照其返回的字元串,通過反射機制創建對象。其他重載的create則是簡化了參數的方法。如create ()將從my.properties文件中讀取typeName鍵映射的類全名,並創建其對象。
註意:create方法的返回值類型為Object,使用時客戶代碼需要自行將其向下造型為適當的類型。
<h4>God類如下:</>
package tool;
import java.io.*;
import java.util.Properties;
public class God{
public static String getValue(String path,String key){
Properties props = new Properties();
try {
InputStream is = God.class.getClassLoader().getResourceAsStream(path) ;
try{
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
props.load(isr);//從流中載入properties文件信息
}catch (java.io.FileNotFoundException e) { e.printStackTrace();}
}catch (java.io.IOException e) { e.printStackTrace();
}
return props.getProperty(key);
}
public static Object create(){
return create("my.properties","typeName");
}
public static Object create(String key){
return create("my.properties",key);
}
public static Object create(String path,String key){
String typeName = getValue(path,key);
Object obj=null;
if(typeName!=null){
try {
obj = Class.forName(typeName).newInstance();
} catch (InstantiationException e) { e.printStackTrace();
} catch (IllegalAccessException e) { e.printStackTrace();
} catch (ClassNotFoundException e) { e.printStackTrace();
}
}
return obj;
}
}