3

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

public IUserFactory
{
    User CreateNewUser();
}

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

5 回答 5

7

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

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

您是否有不同类型的用户,或者用户本身就是某种类型的东西。可能是你没有把事情说清楚。我们通常在抽象工厂方法模式中使用接口,我们需要处理多个相关对象族。

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

于 2009-01-08T03:36:15.573 回答
5

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

于 2009-01-08T03:21:26.990 回答
2

从接口创建工厂可以更轻松地使用模拟类对其进行测试,并使使用 IoC 应用程序变得更简单,因此虽然我可能不一定需要它们来实现应用程序功能,但我通常通过接口构建和调用大多数类.

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

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

于 2009-01-08T03:30:22.277 回答
2

两件事:(1)我会等到我需要(或看到迫在眉睫的需要)一个替代实现,然后再创建接口;(2)接口几乎总是使单元测试更容易,尤其是在模拟时,所以我经常来立即满足对接口的需求。

于 2009-01-08T03:31:07.160 回答
2

这是将相同问题翻译成 Java 的版本。

原始示例

public interface UserFactoryIF
{
   User createNewUser();
}

然后执行Factory

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
    }
}

希望这能说明问题。

于 2009-01-08T04:01:23.353 回答