2012-06-16 81 views
1
public class A { 
    private A(int param1, String param2) {} 

    public static A createFromCursor(Cursor c) { 
     // calculate param1 and param2 from cursor 
     return new A(param1, param2); 
    } 
} 

是否有這種建築規範的設計模式?如果是這樣,這種模式的目的是什麼?爲什麼不直接使用:是否有這種建築規範的設計模式?

// calculate param1 and param2 from cursor 
new A(param1, param2); 
+1

可能重複[靜態工廠方法的構造函數](http://stackoverflow.com/questions/4029622/static-factory-method-for-constructors) –

+0

由於這是無效的Java,似乎沒有考慮到它是一種設計模式。 – Dancrumb

+0

@Dancrumb這裏什麼是無效的? – dantuch

回答

3

所以,總結一下。

這種模式被稱爲靜態工廠方法並且它例如描述如下:How to use "Static factory methods" instead of constructors?

在最簡單的形式,它看起來是這樣的:

class A { 

    public static A newA() { 
     return new A(); 
    } 
    private A(){} 
} 

你的例子是有點更復雜,因爲它包括計算參數調用構造函數

public class A { 
    private A(int param1, String param2) {} 

    public static A createFromCursor(Cursor c) { 
     // calculate param1 and param2 from cursor 
     return new A(param1, param2); 
    } 
} 

我們的目的用這種方式創建新對象可能需要重複這些計算,每次直接調用new A(params)之前。所以這只是避免重複自己,最簡單的方法是創建一個方法。

此外使用相同的方式,您可以提供更多的選項來創建new A。例如,你可以改變你的計算與運作方式:

public static A createFromCursorDifferently(Cursor c) { 
     // calculate param1 and param2 from cursor in different way 
     return new A(param1, param2); 
    } 

然後你可以在同一個參數傳遞給這個方法,結果會有所不同(堂妹的方法名稱不同)。

當然,你可以從任何其他參數創建new A,使用相同的構造函數之前:

public static A createFromObject(Object o) { 
     // calculate param1 and param2 from object 
     return new A(param1, param2); 
    } 

所以,你必須與靜態工廠方法更多的可能性比構造簡單的使用只。

+0

謝謝@dantuch最推薦的書籍之一,這很好地回答了我的問題。 – Johnny

+0

@Johnny,很高興聽到這個;) – dantuch

+1

我想你錯過了這種模式的兩種常見用法。一個是,靜態方法可以選擇實例化哪個類 - 它可以做一些事情,如「if(conditionA)返回新的A(...)else返回新的B(...)'。另一個是允許調用者實例化一個類,該類的構造函數由於某種原因不會公開公開(例如,因爲您想限制誰可以創建它的子類)。 「ByteBuffer」就是一個很好的例子。 – yshavit

2

如果你的代碼編譯,這將是一個簡單的factory method(它返回一個靜態的東西一個療程?)。有些人認爲這是一種模式,但有些則不如,因爲它非常簡單。有一種叫做Abstract Factory Pattern的模式,它使用了這個概念,但是以一種更爲複雜的方式。

1

您發佈的東西的目的應該是,如果得到更正,應提供一種方法來返回某個事件的實例,而不必事先知道運行時類型。

所以是的,這聽起來類似於Factory method pattern,雖然它與你寫的有些不同。 工廠類別應該不同於產品類別類別。

+0

'工廠類別應該與產品類別不同。'這是真的,這就是爲什麼作爲示例提供的代碼是** Static Factory Method **的示例,正​​如@Tomasz Nurkiewicz指出的那樣。並且該靜態方法應該放置在它的分解類中,只是要替換顯式構造函數。它在「有效的Java」中得到了很好的描述 - 對於java程序員 – dantuch