2011-05-10 104 views
4

我必須以4-5種不同方式使用對象Y的屬性(都是相同類型)創建對象X,即根據情況,Y的屬性可以用來以不同的方式初始化X.一種方法是,使用默認構造函數創建一個對象X,然後設置它的屬性,但它有一個缺點,即如果出現問題,那麼我們有一個處於不一致狀態的對象。另一種方法是用虛擬參數爲所有情況創建不同的構造函數,這聽起來很糟糕。 有什麼好的設計模式可以在這裏使用?以不同方式從另一個對象創建對象的設計模式

回答

5

如果兩個對象都是同一類型的,你可以使用工廠方法:

public class Foo { 
    ... 
    public Foo withBar(...) { 
     Foo f = new Foo(this.param); 
     f.setBar(...); 
     return f; 
    } 

    public Foo withBaz(...) { 
     Foo f = new Foo(this.param); 
     f.setBaz(...); 
     return f; 
    } 
} 
... 
Foo y = ...; 
Foo x = y.withBar(...); 

如果類型不同,可以使工廠方法靜態和套印Y作爲參數。

+0

將Y(不同類型)作爲參數傳遞給X的構造函數是否很好?等等,'公共Foo(Bar y){...}' – zygimantus 2015-12-15 08:37:36

3

聽起來像你可以使用Factory Pattern的稍微專用版本。例如。構建對象的一部分可能是將現有實例(或實例的接口)傳遞給初始化新對象。

+0

+1的一些好的優勢將滿足這種情況 – Omnaest 2011-05-10 17:58:50

+0

@ user625146:同意。我提出了模式而不是方法,因爲我認爲這可能有助於kcr的架構。 – 2011-05-10 18:00:15

+0

在工廠模式中,何時將它們用作靜態,何時不用? – r15habh 2011-05-10 18:22:55

2

工廠模式的很好的解釋可以找到here
也約書亞布洛赫是他的書有效的Java建議使用另外使用「工廠法」靜態工廠

相關問題