設計模式之Factory(工廠設計模式)
阿新 • • 發佈:2019-01-14
-
工廠模式是我們很常用的模式了,著名的spring框架就使用了工廠模式。
-
為什麼說工廠模式是最常用的,因為工廠模式就相當於建立物件的new。工廠模式就是用來建立物件的
-
在PatternsInJava
書中把工廠模式主要分為:工廠方法與抽象工廠,當然這本書在舉例的時候用比較簡單的例項,讓你來明白工廠模式具體來做什麼,但是在實際應用中往往要複雜的多,比如spring框架在運用工廠模式的時候,但歸根結底工廠模式主要是用來給我們的程式進行解耦,替我們去建立我們所需的物件。
工廠方法
-
工廠方法一般用於簡單的物件建立,下面簡單的舉一個工廠方法的程式碼例項
所需的類
package com.dongzhu.cn.factory; import com.dongzhu.cn.bean.HisSample; import com.dongzhu.cn.bean.MySample; import com.dongzhu.cn.port.Sample; // 工廠方法類 public class Factory { public static Sample creator(int which){ // .... if(which == 1){ return new MySample(); }else if(which == 2) { return new HisSample(); } return null; } }
// 主啟動類
public class MainClass {
public static void main(String[] args) {
Sample sample = Factory.creator(1);
}
}
其實在我們看來這樣子做,基本上沒什麼用因為它還是強耦合的,但是卻直觀的幫我們重現工廠所幫
我們做的是,那就是建立物件,並且封裝了建立例項的程式碼,以上是工廠方法的舉例。
抽象工廠
- 當我們所建立的物件種類越來越多,越來越複雜我們就得考慮去用抽象工廠,而非方法工廠,兩個模式並沒有很大的區別,區別就是建立物件的複雜度。
- 例:
抽象工廠
public abstract class AbstractClass {
public abstract Sample creator();
public abstract Sample2 Creator2();
}
抽象工廠具體實現
工廠具體實現
public class Factory extends AbstractClass {
@Override
public Sample creator() {
return null;
}
@Override
public Sample2 Creator2() {
return null;
}
}
- 以上就是抽象工廠與方法工廠的兩個例子,看到目前我相信對工廠模式也有一個大概的認識了,但到目前為止兩個例子貌似並沒有什麼實際的作用,這也可以理解畢竟目前是讓你建立起工廠的概念,那麼接下來就簡單的寫一個工廠在實際的運用中的例子
實際運用
- 檔案結構
- 工廠類
public class Factory {
private static HashMap<String, Object> cacheMap = new HashMap();
static {
try {
Properties properties = new Properties();
InputStream inputStream = new FileInputStream("resource/application.properties");
properties.load(inputStream);
Enumeration<?> enumeration = properties.propertyNames();
while (enumeration.hasMoreElements()) {
String className = (String) enumeration.nextElement();
String classPath = properties.getProperty(className);
Class<?> temp = Class.forName(classPath);
Object object = temp.newInstance();
cacheMap.put(className, object);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static <T> T getInstance(String name) {
return (T)cacheMap.get(name);
}
}
- 主啟動類
public class MainClass {
public static void main(String[] args) {
HisSample hisSample = Factory.<HisSample>getInstance("hisSample");
System.out.println(hisSample);
}
}
- 以上就是基本的工廠在實際當中運用,這樣就能大大減少程式的耦合,利用反射建立我們所需的類,就算我們刪除了某些類也不會出現報錯,只需要改動properties檔案內容即可,是不是很方便,spring框架也是相同的思想,但是同時也要說一句spring框架內部實現比我所寫的小例子要大的多的多,要考慮的問題也要多的多的多。
宣告:本章參考了patternInJava 書籍