2011-10-01 166 views
5

我只是在學習java,而我遇到了一些問題。 下面我們就簡單工廠模式:自動工廠註冊

public class SomeFactory { 
    ... 
    public static void registerProduct(String name, Class<? extends IProduct > f) 
} 

public SomeProduct implements IProduct { 
    static { 
     SomeFactory.register("some product", SomeProduct.class); 
    } 
    ... 
} 

所有產品應該在出廠登記。

但是在使用此代碼之前,應該加載所有的產品類。 我可以把Class.forName()放在某個地方,例如在main函數中。 但我想避免這樣的手動類加載。我只想添加新的IProduct 實現,而不更新其他部分(如SomeFactoryMain方法等)。 但我想知道,是否可以自動加載一些類(例如標註了註釋)?

P.S我想要注意的是,在運行時不會添加其他類,所有IProduct實現在編譯之前都已知。

UPD#1 感謝您的回答! 但是有可能使用IProduct實例自動生成屬性文件? 我的意思是可以製作一些生成屬性文件或加載程序代碼的構建時腳本(例如,用於maven)?有沒有這樣的解決方案或框架?

UPD#2 我完成使用Reflections library,其提供運行時信息,通過在啓動時掃描類路徑。

回答

5

這是可能的,但不容易。它需要掃描類路徑中的所有類,以查看它們是否有註釋或實現IProduct接口。有關此類問題的答案,請參閱How do you find all subclasses of a given class in Java?

我會保持簡單,只需要在工廠本身或外部文件(例如屬性文件)中加載類的列表。

3
  1. 讓每個產品自身進行註冊,使用靜態塊這樣的:

    class MyProduct1{ 
    
        static{ 
         SomeFactory.register(this.getClass()); 
        } 
        .. 
        .. 
    } 
    
  2. 外部屬性文件可以跟蹤所有產品。

  3. 您的主要方法可以解析此產品列表並執行Class.forName(「..」)。

這樣你就不需要編碼任何特定的產品,只是屬性文件不斷變化。啊!是的,加入安全註冊也是一個加點。

注:我只是提出一個想法,I'vent嘗試過自己:)

+6

怎麼是'this.getClass()'將在'靜態{}'...工作O_O? –