2010-01-07 50 views
3

有時我們設計多個算法來獲得相同的結果。例如,我編寫了一個將數據存儲在樹中的類,另一個類存儲了大致相同的數據,例如鏈接列表。使用類/方法的不同實現的設計模式

我將發佈一個名爲ThingStore的接口(抽象類),並將其分類爲TreeThingStore和ListThingStore,每個分別使用樹或鏈接列表。因爲我發佈了一個抽象類,所以我必須有人來決定使用哪個實現(EDIT:因此調用者不會在乎這個),並且我沒有這個問題硬編碼。我不止一次需要這個,但我已經看不清楚GoF和其他設計模式目錄。最相似的模式是「策略」模式,但它實現了多種目標。

那麼,這種意圖是否有設計模式?如果不是,有人可以創建一個或告訴我爲什麼不應該這樣做(或更好的方法來實現相同的結果)?

回答

3

你會指定這樣的實現有點奇怪。爲什麼你的來電者關心你如何實現一個特定的功能?他應該關心的是,您的數據存儲正確存儲數據,而不是真正關心您使用的基礎數據結構。但是,假設實現在外部表示爲數據存儲的不同特徵(一個對於大量插入更好,而另一個對於大量讀取更好)。然後,由調用者指定他們想要實例化的具體類。作爲班級設計師,對於你來說,假設你知道得最好,這有點過於自負。 :)

鑑於此,您可以將對象的創建包裝到Factory中,並允許您的用戶指定哪些功能是重要的。你甚至可以進一步使用Inversion of Control pattern,你可以讓你的調用者實例化並給你一個存儲機制來使用,但是這對你正在嘗試做的事情來說似乎是過度的。

+0

也許我還沒有明確表態。來電者不在乎我如何實施。這正是我需要某種方式的原因,以便它創建一個對象而不關心它將使用哪種算法 – 2010-01-07 11:14:46

+0

也許一個實現是基本和免費的,您需要爲另一個實現付費。 – 2017-09-05 15:18:21

0

查看Factory PatternAdapter Pattern(取決於您要查找的內容)。適配器更多地用於包裝退出實施,其中工廠用於從子類或複合類樹中創建。

工廠可能是你最親密的模式,因爲它允許類似的設計:

ThingStore theThingStore = ThingStoreFactory.GetStore("tree"); 
2

我建議你檢查Bridge模式。它的目的是將抽象與其實現分離開來,以使兩者可以獨立變化。

Java API中的集合類框架提供了使用橋接模式的幾個示例。 ArrayList和LinkedList具體類都實現了List接口。 List接口提供常見的抽象概念,例如添加到列表中的能力以及詢問其大小。 ArrayList和LinkedList之間的實現細節不盡相同,主要是關於何時爲列表中的元素分配內存。

使用Bridge pattern工廠獲得您的客戶感興趣的具體實施似乎是一個合適的方法來解決您的問題。

相關問題