3

默認情況下爲域對象工廠使用接口還是僅在需要時才爲工廠類保留接口?如何在域驅動設計中使用工廠模式的接口?

public IUserFactory 
{ 
    User CreateNewUser(); 
} 

public UserFactory : IUserFactory 
{ 
    public User CreateNewUser() 
    { 
     return new User(); 
    } 
} 
+0

爲什麼......?總是這樣做的好處是什麼? – yfeldblum 2009-01-08 03:47:20

+0

雖然你的例子是在C#中,但我們沒有理由不能在Java中提出這個設計問題。 – Alan 2009-01-08 03:50:54

+0

是的,我不是故意拋棄java人或任何其他人 – 2009-01-08 04:17:01

回答

2

下面是將相同問題翻譯成Java。

原來的例子

public interface UserFactoryIF 
{ 
    User createNewUser(); 
} 

則工廠

public class UserFactory implements UserFactoryIF 
{ 
    public User createNewUser() 
    { 
     // whatever special logic it takes to make a User 
     // below is simplification 
     return new User(); 
    } 
} 

我看不出有任何特殊的利益界定爲工廠的接口,因爲你定義一個接口的實現爲中央生產者。通常情況下,我發現我需要生產同類產品的許多不同實現,而我的工廠需要消耗許多不同類型的參數。也就是說,我們可能有:

public interface User 
{ 
    public String getName(); 
    public long getId(); 
    public long getUUID(); 
    // more biz methods on the User 
} 

工廠應該是這樣的:

public class UserFactory { 

    public static User createUserFrom(Person person) { 
     // ... 
     return new UserImpl(...); 
    } 

    public static user createUserFrom(AmazonUser amazonUser) { 
     // ... special logic for AmazonWS user 
     return new UserImpl(...);   
    } 

    private static class UserImpl implements User { 
     // encapsulated impl with validation semantics to 
     // insure no one else in the production code can impl 
     // this naively with side effects 
    } 
} 

希望這橫跨得到點。

5

並非所有的東西都必須有一個接口;如果你有一個單一的實現,並沒有理由有任何其他的我不明白爲什麼定義一個接口。

2

創建工廠關閉的接口可以讓你更容易與模擬類測試它們,以及使它更易於使用IoC的應用,所以雖然我不一定需要他們的應用程序的功能,我一般建立和呼叫大多數類通過接口。

如果你不考慮單元測試或IoC的模式(宗教觀點除外),我可能不會理會。

我發現使用它們,在Visual Studio中至少最大的痛苦,就是「轉到定義」的性質或功能跳轉到接口的定義,而不是類定義。

2

兩件事情:(1)我想等到我需要(或者看到一個迫在眉睫的需求)的替代實施之前我想創建界面和(2)接口幾乎總是讓單元測試更加簡單,尤其是與嘲諷,所以我經常想出一個需要接口的需求。

7

在你給出的例子中,我甚至不知道你爲什麼需要去工廠。

工廠模式的本質是 到「定義的界面,用於創建 對象,但讓子類 決定將哪一個類實例。該 工廠方法使一個類推遲 實例化到子類。」 - 維基百科

您是否擁有不同類型的用戶,或者用戶本身就是某種類型的用戶。可能你沒有明確說明這件事。我們通常使用接口抽象工廠方法模式,這裏我們需要處理相關對象的多個家庭。

注意:不要忘了,模式是有幫助我們,這並不意味着我們必須使用他們,因爲他們是可用的,我們是否需要與否。