現在的需求是根據類的全名。來創建對象
package 中介者設計模式;
import java.util.Date;
public class CreateObject {
public static void main(String[] args) {
Object obj = createInstance("java.util.Date");
System.out.println(obj);
Date d = createInstance(Date.class);
System.out.println(d);
}
//提供一個方法,根據傳入的參數全名創建一個對象並且返回
public static Object createInstance(String className){
try {
Class clz = Class.forName(className);
Object obj = clz.newInstance();
return obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//重載的方法(這個方法還是沒有解決問題)
public static <T> T createInstance(Class<T> clz){
try {
return clz.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//傳遞一個類的全新類名來調用對象,將上述兩種方案進行合體
public static <T> T createInstance(Class<T> checkType,String className){
try {
Class<T> clz = (Class<T>)Class.forName(className);
Object obj = clz.newInstance();
//需要檢查checkType是不是obj的字節碼對象
if (!checkType.isInstance(obj)) {
throw new Exception("對象跟字節碼不兼容");
}
return (T)obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
Spring也是這樣做的。我們把公用的代碼封裝到一個工具類中,就可以了。
package 中介者設計模式;
//對象工廠
public class BeanFactory {
//傳遞一個類的全新類名來調用對象,將上述兩種方案進行合體
public static <T> T getBean(Class<T> checkType,String className){
try {
Class<T> clz = (Class<T>)Class.forName(className);
Object obj = clz.newInstance();
//需要檢查checkType是不是obj的字節碼對象
if (!checkType.isInstance(obj)) {
throw new Exception("對象跟字節碼不兼容");
}
return (T)obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
大家都知道工廠的設計模式是單例的設計模式:
單例的設計模式寫法有好幾種形式比如1:枚舉方法創建工廠射進模式
package 中介者設計模式;
//對象工廠
public enum BeanFactory {
//傳遞一個類的全新類名來調用對象,將上述兩種方案進行合體
INSTANCE;
public <T> T getBean(Class<T> checkType,String className){
try {
Class<T> clz = (Class<T>)Class.forName(className);
Object obj = clz.newInstance();
//需要檢查checkType是不是obj的字節碼對象
if (!checkType.isInstance(obj)) {
throw new Exception("對象跟字節碼不兼容");
}
return (T)obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
外界是怎么調用這個方法那,BeanFactory.INSTANCE.getBean();就行了是不是很簡便啊 。
