2010-06-03 62 views
5

爲什麼我們需要抽象工廠設計模式來創建對象?爲什麼我們不能使用新的操作符? 的答案是,避免緊密耦合的對象。但我不明白如何?任何人都可以用代碼解釋(將是非常有用的)。抽象工廠設計模式來創建對象?爲什麼我們不能使用新的操作符?

是什麼使抽象工廠設計模式有用和何時。

在此先感謝。 Harsha T

+4

有很多很好的解釋(如恩里科的鏈接下面),這與谷歌或兩個發現我真的看不出任何價值在這裏複製。如果你發現一個似乎難以令人信服的解釋,那麼關於這個解釋的具體問題可能會更有趣。 – djna 2010-06-03 14:39:17

回答

2

如果使用new運算符,則必須指定所需的確切類型。 有時你想更通用一些,例如,因爲你希望能夠在所有代碼庫中快速更改該實例化類型。

2

抽象工廠設計模式被設計爲與在初始化時特定的設置創建一個對象。例如,如果你有很多類似的連接類,而不是重複相同的4行以上[和使用複製和粘貼],抽象工廠將允許您將4條以上的行保留在一個位置,並減少需要更改。

Reference For Abstract Factory

0

有上Wikipedia一個相當不錯的C#示例。它使您的應用程序級代碼不必知道它獲得了哪些實現。工廠照顧它。

0

使用抽象工廠,您可以在不知道實際類型的情況下創建對象。假設你需要一個IDictionary。你可以創建一個你熟悉的二叉樹類的新實例,或者你可以告訴IDictionary工廠你需要一個新實例。然後其他人可以創建一個返回散列表的工廠實現,但是你身邊的所有東西仍然會以同樣的方式工作。

0
  • 首先你不需要知道具體類型的對象你的工廠的實例,
  • ,那麼你可以插在你的項目中的工廠類,讓他們實例爲組件的對象,而不必使用new在您的代碼中。該工廠已經完成其骯髒的工作
  • 它在概念上分離對象,從他們使用的實例,讓事情脫鉤
1

下面是我爲我們的產品版本的獨立層得出一個簡單的例子:

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對象來根據特定的版本標識符來決定我想要創建的基本工廠。這使我可以根據需要插入新版本,而不會干擾現有的基礎架構,這在這種情況下非常有用。事實上,如果我需要的話,它可以讓我插入全新的產品,這通常是有用的,但在我的情況下是不值得的實施工作。

2

如果您有:

class Foo implements DoSomething {...} 
class Bar implements DoSomething {...} 

obj = new Foo(); 
obj.doSomething(); 

無處不在你的代碼,一旦你想改變的所有實例使用酒吧的情況下,你真的打算做查找/替換?


如果您有:

obj = DoSomethingFactory.create(); 
obj.doSomething(); 

的DoSomethingFactory裏面,你可以回到你想要實現的DoSomething的接口的任何對象。

通過使用工廠,您可以控制由它創建的所有對象。

如果您決定更改Factory創建對象的方式,則更改將立即在使用Factory的代碼中生效。