2010-06-29 61 views
3

是否有可能讓具體工廠使用抽象工廠模式創建具有類型特定參數的具體類?還是由他們各自的混凝土工廠創建的不同具體類需要具有相同的領域?在下面的圖像中,你將如何用客戶端(應用程序)給出的不同參數集來實例化WinButton和OSXButton?如何爲抽象工廠創建的類設置特定屬性?

enter image description here

回答

0

一種解決這些問題的方法之一是發送對象的參數。例如,在C#中Object是基類&您可以傳遞可以接受任何派生類的Object類型的參數。在實現中,這個對象可以被轉換回所需的派生類型。甚至可以通過這種方式設置特定的屬性。

+0

使用Object類的泛型類型,然後將其投射到一個特定的類不是因爲它很好的解決不是類型安全的,它違反了至少一個面向對象的原則即Liskov替代原則。此外,要創建的具體類可能需要爲其各自的構造提供不同數量的參數。 – Christian 2011-05-19 06:34:32

+0

我同意,它不是類型安全的。關於不同數量的參數,你可以有一個由其他類型組成的類型。 – 2011-05-19 07:41:51

+0

您的意思是一個數據結構,您可以在其中存儲不同具體類型的創建參數?在這種情況下,每次添加新結構時都必須更改數據結構。 – Christian 2011-05-19 10:05:30

0

沒有更多細節,這並不容易。我會做的一件事是嘗試將參數傳遞給具體工廠類的構造函數。對於不同的參數,你將不得不創建不同的工廠實例,這可能不是最好的解決方案,但如前所述,這取決於細節。

例子:

 
    GUIFactory factory = new WinFactory(WIN_9x_THEME); 
    Button greyButton = factory.createButton(); 
    factory = new WinFactory(WIN_VISTA_THEME, 50); 
    Button semiTransparentButton = factory.createButton(); 
+0

這是做這件事的一種方式,但你有點遺漏模式的抽象性,因爲正如你所指出的那樣,工廠類將不得不爲每一組新的參數值重新實例化。你可以直接實例化concrecte類而不是通過工廠類。 – Christian 2011-06-27 06:26:08

+0

@Christian:不是真的......如果你在編碼過程中知道各組參數的組合,你可以爲工廠設置工廠 - 這有點複雜,所以基於依賴注入的解決方案更有意義。最後,這一切都取決於具體的語言和應用。 – 2011-06-27 08:11:29

+0

嗯......工廠工廠;你可能有代碼示例?關於它取決於語言和應用程序,是不是模式應該是語言和應用程序不可知的? – Christian 2011-06-27 20:30:34