如何在域驱动设计中使用工厂模式的接口?

时间:2009-01-08 03:16:46

标签: design-patterns oop domain-driven-design factory domain-object

默认情况下,为域对象工厂使用接口是否有意义,或者只有在需要时才为工厂类保留接口?

public IUserFactory
{
    User CreateNewUser();
}

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

5 个答案:

答案 0 :(得分:7)

在你给出的例子中,我甚至不知道为什么你需要去工厂。

  

工厂模式的本质是   “定义用于创建的界面   一个对象,但是让子类   决定实例化哪个类。该   工厂方法让课程推迟   实例化到子类。“ - 维基百科

您是否拥有不同类型的用户,或者用户本身就是某种类型的用户。可能是你没有清楚地阐述这件事。我们通常在抽象工厂方法模式中使用 interface ,我们需要处理多个相关对象系列。

注意:不要忘记,模式可以帮助我们,这并不意味着我们必须使用它们,因为它们是可用的,无论我们是否需要它们。

答案 1 :(得分:5)

并非所有东西都必须有接口;如果你有一个单独的实现,没有理由有任何其他我不明白为什么定义一个接口。

答案 2 :(得分:2)

通过接口创建工厂可以更容易地使用模拟类测试它们,并且使得使用IoC应用程序变得更加简单,因此虽然我可能不一定需要它们用于应用程序功能,但我通常构建并调用大多数通过接口的类。

如果你不考虑单元测试或IoC模式(抛开宗教观点),我可能不会打扰。

我发现使用它们的最大痛苦,至少在Visual Studio中,是对属性或函数的“Go To Definition”跳转到接口定义,而不是类定义。

答案 3 :(得分:2)

两件事:(1)在创建界面之前,我会等到我需要(或看到迫在眉睫的需求)替代实现,并且(2)接口几乎总是使单元测试更容易,特别是使用模拟,所以我经常想出一个接口。

答案 4 :(得分: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
    }
}

希望这可以解决问题。