2012-01-25 60 views
4

我一直在想我應該如何編寫以及爲了創建對象列表而使用哪種設計模式。實例化對象列表的正確方法

首先,考慮我有一個客戶類和一個訂單類。 我想獲得屬於用戶的所有訂單。

我想$ oCustomer-> getOrders();返回Order對象的數組。

基本上,我一直在思考的:

一個的OrderManager類,它是一個獨立的,並具有從存儲引擎檢索訂單數據,並建立Order對象的能力。但是我到處都在看這是一個糟糕的做法,所以這看起來不是一個好主意。

在Order類中使用靜態方法,例如getOrders(args),但我不確定這是靜態方法的真正意義。

使用工廠(我從來沒有用過,黯然)來處理對象創建(我可能需要一些例子有)

使用一個實例化Order對象中的一個方法。這似乎是世界上最糟糕的選擇,因爲我真的不認爲一個對象應該能夠返回它自己的集合。

這看起來像一個非常基本的任務,我猜是這樣。但是,我無法找到任何人提供「適當」的方式來做到這一點。 我很滿意添加其他類等(如DataMapper,Gateways,aso ...來處理檢索和映射),但我真的不想在buisness邏輯中與這些進行交談。

在此先感謝。

+0

因爲您沒有upvote或回答任何現有的答案,請你更新你的問題,關於你在尋找答案的更多細節。謝謝。 – Gordon

回答

2

看一看在Lazy Load pattern from POEAA

Lazy Load pattern from POEAA

注意,有圖不建議把邏輯從數據庫中的訂單獲取到客戶對象。相反,該模式暗示:

延遲加載有四種主要變種。 延遲初始化使用特殊的標記值(通常爲空)來指示未加載字段。每次對字段的訪問都會檢查標記值的字段,如果未加載,則加載它。 虛擬代理是一個與真實對象具有相同接口的對象。第一次調用它的方法時,它會加載實際的對象,然後進行委託。 Value Holder是一個帶有getValue方法的對象。客戶端調用getValue來獲取真實對象,第一個調用觸發負載。 A ghost是沒有任何數據的真實對象。當你第一次調用一個方法時,鬼將所有數據加載到它的字段中。

有關其他圖案,請考慮Repository並查看Data Source Architectural Patterns。一般來說,當你有很多對象關係行爲問題時,可以考慮使用一個ORM,比如Doctrine2。

+1

@ user1159791在創建客戶時拉出完整的對象圖或者使用上面提到的任何選項使用Lazy Loading。或者,將訂單庫注入客戶。 – Gordon

0

您可以使用一個表示與數據庫的連接的類,一個數據訪問對象使用此類,一個類使用實際對象。

http://en.wikipedia.org/wiki/Data_access_object

+0

嗨, 這可能有助於檢索數據,但我不知道這將如何讓我建立一個對象列表,問題保持不變。 如果我理解的很好,DAO會讓我處理數據存儲,並映射到我的buisness對象。但我不得不要求DAO創建我不想要的對象列表。另外,我將爲每個buisness對象設置1個DAO,這將很快變得凌亂 – user1159791

+0

在這種設計模式中,DAO的目的確實是返回一個對象列表。我不知道有任何其他方式來正確地將數據檢索從模型中分離出來。我希望學習其他方法來做到這一點。 – 2012-01-25 11:01:55

+0

我只想在編輯商業邏輯時一直使用我的商業對象。我需要在應用程序的buisness邏輯中完全地提供數據訪問層的抽象。不知道我是否清楚。也許這是一個非常糟糕的做法,我真的不知道:s – user1159791