如何獲得同一個通用(超級)工廠
阿新 • • 發佈:2021-02-03
我的上一篇文章寫了通用工廠模式建立物件。
但是,工廠還是需要new的呢。就像在servlet中,需要多個servlet,就需要多個service,我們通過建立工廠,就是為了方便來獲取物件,不在用new,減少耦合。工廠還是不能只用來建立一個簡單的user類物件的,要解決實際問題。
我們需要來獲得工廠,而這個工廠可能包含成千個類,重新new一個會帶來很多問題,例如:資料不能共享,產生更多的記憶體開銷。在spring框架中有一個介面ApplicationContextAware可以解決這個問題。而我沒有看過spring的原始碼,也不太清楚怎麼實現的。
我能想到的只是應用單例設計模式。把物件的建立細節隱藏,來建立工廠。
/** * 工廠是單例模式 */ public class TryGetFactory { private static BeanFactory factory; private TryGetFactory(){}; public static BeanFactory getFactory(){ if(factory==null){ synchronized (TryGetFactory.class){ if(factory==null){ factory = new BeanFactory(); } } } return factory; } }
test程式碼如下:
@org.junit.Test
public void test(){
BeanFactory factory = TryGetFactory.getFactory();
System.out.println(factory);
BeanFactory factory1 = TryGetFactory.getFactory();
System.out.println(factory1);
}
結果:
就這樣解決了問題。
可能會有這樣一個疑惑?那個配置檔案怎麼傳呢?其實沒有大礙,在TryGetFactory中getFactory中加一個String path即可。
那麼如何獲得輸入流呢?
Class.getResourceAsStream("path");
即可獲得輸入流。 記住,path要帶‘/’,否則就要Class.getClassLoader().getResourceAsStream();
這裡的檔案路徑預設都是放在根目錄SRC下。