2009-12-16 98 views
1

我有一個字段的對象。 在一個項目中,我需要這個充滿信息的對象。誰負責設置對象屬性?

誰的責任就是填補這個對象?

我想要一個方法,如getFilledObject(),它返回一個完整的填充對象到我的程序。

我可以把這個邏輯放入主流程中,並將其填充到「原地」,我也可以將此方法添加到類本身中,以便根據我傳遞的參數知道如何填充自身。 後一個決定是夠好的,唯一的問題是,這個類必須知道更多關於它的本質,而不是一個簡單的普通get-set類。

但我覺得既不是決定就夠了。它應該是什麼?只包含填充對象的邏輯的助手類?


你知道,是的,工廠就是我一直在尋找,但它總是與多態性一起提及。在我的情況下,我根本不需要它。所以我可以稱它爲工廠,但它真的會成爲他們所謂的「工廠模式」嗎?

那麼我們作爲結果有什麼? 第一,靜態工廠方法

 
class A { 
ObjType1 obj1; 
ObjType2 obj2; 

public A() {} 

public static getA(int param1, int param2) { 
    A a = null; 
    ObjType3 obj3 = null; 
    if (somelib.complexCheck(param)) { 
    obj3 = someotherlib.getSomething(param2); 
    // other stuff 
    } 
    if (obj3 != null) { 
    // do something with getters & setters, fill a 
    } 
    return a; 
} 

和工廠模式或類似的東西給它

 
class Fact { 
public static A getA(int param1, int param2) { 
    // do all that stuff here 
} 
} 

在我看來,區別是很多在A級進口指令在靜態工廠方法的情況下,。另外,如果所有這些需要相同的庫,我們可以將類似的靜態方法放入Fact類中。

你會在兩者之間選擇什麼?

+1

「問題是,這個類必須知道更多關於它的性質,而不是一個簡單的普通get-set類」這是一個「問題」?真?你在說什麼?如何 - 確切地說 - 這是一個問題嗎?這聽起來像是一個階級的基本定義:它在一個地方擁有所有的責任和知識。你在說什麼「問題」?你能澄清你的問題嗎? – 2009-12-16 14:10:51

+0

好吧,讓我們說我必須檢查我正在尋找的對象是否在HttpSession中。如果是這樣,我可以檢查它是否正常或損壞。如果不存在,我必須查詢數據庫並構造一個複雜的對象,然後返回對其的引用。我覺得把getter/setter和解壓縮信息解耦,在這裏會更好。你怎麼看? – EugeneP 2009-12-16 14:13:28

回答

1

此信息來自哪裏?它是硬編碼/一致的嗎?使用對象的constructor。它是可變的還是來自數據存儲?使用DAO pattern

+0

它來自DataStore。 – EugeneP 2009-12-16 14:38:19

+0

這是一個關於DAO模式的啓動教程:http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html – BalusC 2009-12-16 14:58:03

1

約書亞·布洛克討論靜態工廠,並從他的書有效的Java第二版在此excerpt生成器模式。

+0

在我看來,你回答了我的問題。但它證明了提取/獲取參考邏輯應該保持在對象內。真的嗎? – EugeneP 2009-12-16 14:42:24

+0

是的,從這個意義上說,引用的模式是強加內部一致的對象狀態的方式。實現這一點的方式是實現細節。由於您的源代碼是DataStore,因此BalusC建議的DAO模式可以最大限度地減少原始問題中提到的耦合。 – trashgod 2009-12-16 15:22:18

0

關於你的最後一句話:'所以我可以稱它爲工廠,但它真的會成爲他們所謂的「工廠模式」嗎?
恕我直言,模式只是思考的食物。如果你正在做的事情符合確切的教科書定義(無論如何有爭議),不要太擔心。:-)

+0

同意。好評。 – EugeneP 2009-12-16 14:45:11