2014-04-17 201 views
3

在大多數情況下,當我們編寫一個工廠方法時,它是一系列可以持續增長的條件。寫這種方法最有效的方法是什麼(至少具有if條件)?寫出工廠方法最有效的方法是什麼?

public A createA(final String id) { 
    if (id.equals("A1")) { 
     return new A1(); 
    } 
    else if (id.equals("A2")) { 
     return new A2(); 
    } 
    return null; 
    } 
+1

關於stackoverflow,這個問題可能會被視爲主觀性關閉。對於這種編程風格的問題,http://programmers.stackechange.com會更合適。 – oberlies

回答

9

你可以使用一個Map<String, Supplier<A>>

Map<String, Supplier<A>> map = new HashMap<>(); 
map.put("A1",() -> new A1()); 
map.put("A2",() -> new A2()); 

... 

public A createA(final String id) { 
    Supplier<A> supplier = map.get(id); 
    if (supplier != null) { 
     return supplier.get(); 
    } 
    throw new IllegalArgumentException("unknown id: " + id); 
} 

它使用一個標準的Java 8 Supplier接口,與Java 8 lambda語法,但當然,你可以定義自己的供應商接口,並使用匿名內部類創建實例。

+0

不太熟悉lambda,但這是懶惰還是渴望初始化? – Fuhrmanator

+0

@Calum這在技術上是渴望的。一個匿名類是立即構造的,它通過_get()_方法創建了一些類的新實例,但在任何時候都不會創建一個對象,直到需要爲止。 – Marco

1

我喜歡原型地圖的方法 - 只是在某個階段填充原型 - 無論是在靜態塊或類構造函數。代碼看起來大致是這樣的

Map<String, A> archetypes; 

    public A createA(final String id) 
    { 
    A a = archetypes.get(id); 
    return (a!=null)?a.copy():null; 
    } 
0

此方法是延遲初始化。假設你有對應於id中的名稱的類:

public A createA(final String id) { 
    // warning, should not use an id string that is tainted (eg from user input) 
    return (A) Class.forName(id).newInstance(); 
} 
相關問題