爲什麼我們需要抽象工廠設計模式來創建對象?爲什麼我們不能使用新的操作符? 的答案是,避免緊密耦合的對象。但我不明白如何?任何人都可以用代碼解釋(將是非常有用的)。抽象工廠設計模式來創建對象?爲什麼我們不能使用新的操作符?
是什麼使抽象工廠設計模式有用和何時。
在此先感謝。 Harsha T
爲什麼我們需要抽象工廠設計模式來創建對象?爲什麼我們不能使用新的操作符? 的答案是,避免緊密耦合的對象。但我不明白如何?任何人都可以用代碼解釋(將是非常有用的)。抽象工廠設計模式來創建對象?爲什麼我們不能使用新的操作符?
是什麼使抽象工廠設計模式有用和何時。
在此先感謝。 Harsha T
如果使用new
運算符,則必須指定所需的確切類型。 有時你想更通用一些,例如,因爲你希望能夠在所有代碼庫中快速更改該實例化類型。
在這裏你可以找到一個很好的解釋舉例:
抽象工廠設計模式被設計爲與在初始化時特定的設置創建一個對象。例如,如果你有很多類似的連接類,而不是重複相同的4行以上[和使用複製和粘貼],抽象工廠將允許您將4條以上的行保留在一個位置,並減少需要更改。
有上Wikipedia一個相當不錯的C#示例。它使您的應用程序級代碼不必知道它獲得了哪些實現。工廠照顧它。
使用抽象工廠,您可以在不知道實際類型的情況下創建對象。假設你需要一個IDictionary。你可以創建一個你熟悉的二叉樹類的新實例,或者你可以告訴IDictionary工廠你需要一個新實例。然後其他人可以創建一個返回散列表的工廠實現,但是你身邊的所有東西仍然會以同樣的方式工作。
new
在您的代碼中。該工廠已經完成其骯髒的工作下面是我爲我們的產品版本的獨立層得出一個簡單的例子:
interface ICadSystemFactory
{
ICadSystem GetSystemInstance();
}
class 3dCadSystemVersion1 : ICadSystemFactory
{
ICadSystem GetSystemInstance()
{
return new 3dCadSystemWrapperVersion1(new 3dCadSystemVersion1());
}
}
class 3dCadSystemVersion2 : ICadSystemFactory
{
ICadSystem GetSystemInstance()
{
return new 3dCadSystemWrapperVersion2(new 3dCadSystemVersion2());
}
}
3dCadSystemWrapperVersionX對象實現ICadSystem接口的位置。我使用一個Registry對象來根據特定的版本標識符來決定我想要創建的基本工廠。這使我可以根據需要插入新版本,而不會干擾現有的基礎架構,這在這種情況下非常有用。事實上,如果我需要的話,它可以讓我插入全新的產品,這通常是有用的,但在我的情況下是不值得的實施工作。
如果您有:
class Foo implements DoSomething {...}
class Bar implements DoSomething {...}
obj = new Foo();
obj.doSomething();
無處不在你的代碼,一旦你想改變富的所有實例使用酒吧的情況下,你真的打算做查找/替換?
如果您有:
obj = DoSomethingFactory.create();
obj.doSomething();
的DoSomethingFactory裏面,你可以回到你想要實現的DoSomething的接口的任何對象。
通過使用工廠,您可以控制由它創建的所有對象。
如果您決定更改Factory創建對象的方式,則更改將立即在使用Factory的代碼中生效。
有很多很好的解釋(如恩里科的鏈接下面),這與谷歌或兩個發現我真的看不出任何價值在這裏複製。如果你發現一個似乎難以令人信服的解釋,那麼關於這個解釋的具體問題可能會更有趣。 – djna 2010-06-03 14:39:17