簡體   English   中英

如果使用的是Factory Pattern,我們應該向用戶隱藏產品嗎?

[英]If we are using Factory Pattern should we hide products from user?

假設我有一個AnimalFactory類,它生成Dog, CatFish 使用AnimalFactory可簡化事情,一切都很好。

我的問題是,是否有規則或良好做法建議我們將狗,貓和魚隱藏起來以免直接使用? 我的意思是Dog myDog = new Dog(); 將在代碼中被禁止。

如果存在,我們如何正確隱藏它們?

除了指出接口方面的其他答案外,如果需要以某種方式構造復雜的對象,並且您想在一個地方(即工廠)執行該要求,則工廠模式也很有用。 在這種情況下,最好也根據您的問題來確保構造該對象的任何其他方式。

是的,如果僅通過工廠創建對象,則應盡量避免有人跳過此規則。

在c#中,如果Dog,Cat和Fish的使用者位於不同的程序集中,則可以使構造函數內部化,這樣,只有在與“動物”相同的程序集中實現的工廠才能創建它們。

我確定Java中有類似的東西。

這完全取決於消費者是否需要關心狗或貓,還是只需要一些動物就可以了?

也就是說,如果Animal.Speak()很好,則只需公開動物,並將實現細節留給消費者即可。 但是,如果有特定於Dog的東西,例如Dog.BarkAtMoon(),那么您必須了解如何使用它。

此外,您可能希望依賴於接口,例如IAnimal。 然后,您有了Dog:IAnimal類,並且您的工廠返回了IAnimals。 這樣,消費者對實現的了解甚至更少 ,只有接口。

也許你會

class AnimalFactory
{
  IAnimal GetAnimal(AnimalTypeEnum type) { ... return IAnimal type requested ... }
  Dog GetDog(string name) { ... just give me a dog named "name" (or IDog) ... }
}

要回答您的問題,是的。 請允許我詳細說明-

當我們直接實例化Dog myDog = new Dog();對象時Dog myDog = new Dog(); 我們編寫一個依賴項。

現在說,您希望為實例化Dog的函數編寫一個單元測試用例,您將沒有機會用模擬Dog對象替換實際的dog對象。 因此,我們堅持使用接口並從外部提供依賴項。

如果我要強制使用Interface並禁止使用new運算符,則可以進行以下設置-

  1. 接口組裝-這將定義public interface IDog

  2. 用於具體實現的程序集- internal class Dog具有internal class Dogpublic class FactoryCreate函數將返回IDog

  3. 客戶端的組裝-這里將無法訪問Dog ,因此客戶端創建dog實例的唯一方法是通過factory,該工廠將返回IDog諸如此類的IDog dog = factory.Create();

我保持設置非常簡單只是為了傳達我的觀點

依賴倒置原則告訴我們,客戶端類應避免依賴於具體的實現。 工廠模式通過使客戶端免受創建邏輯的影響來簡化此操作,並且客戶端將使用接口而不是某些具體的類。 將具體類包的構造函數設為本地而不是公共的可能是一種好方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM