1. 程式人生 > 其它 >如何獲得同一個通用(超級)工廠

如何獲得同一個通用(超級)工廠

技術標籤:筆記java設計模式

我的上一篇文章寫了通用工廠模式建立物件。

但是,工廠還是需要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下。