默认情况下为您的域对象工厂使用接口是否有意义,或者是否应该只在需要时为工厂类保留接口?
public IUserFactory
{
User CreateNewUser();
}
public UserFactory : IUserFactory
{
public User CreateNewUser()
{
return new User();
}
}
默认情况下为您的域对象工厂使用接口是否有意义,或者是否应该只在需要时为工厂类保留接口?
public IUserFactory
{
User CreateNewUser();
}
public UserFactory : IUserFactory
{
public User CreateNewUser()
{
return new User();
}
}
在你给出的例子中,我什至不明白你为什么需要去工厂。
工厂模式的本质是“定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法让一个类将实例化推迟到子类。” - 维基百科
您是否有不同类型的用户,或者用户本身就是某种类型的东西。可能是你没有把事情说清楚。我们通常在抽象工厂方法模式中使用接口,我们需要处理多个相关对象族。
注意:不要忘记,模式可以帮助我们,这并不意味着我们必须使用它们,因为它们是可用的,无论我们是否需要它们。
并非所有东西都必须有接口;如果你有一个单一的实现,而没有理由有任何其他的,我看不出为什么要定义一个接口。
从接口创建工厂可以更轻松地使用模拟类对其进行测试,并使使用 IoC 应用程序变得更简单,因此虽然我可能不一定需要它们来实现应用程序功能,但我通常通过接口构建和调用大多数类.
如果您不考虑单元测试或 IoC 模式(除了宗教观点),我可能不会打扰。
我发现使用它们的最大痛苦,至少在 Visual Studio 中,是属性或函数上的“转到定义”跳转到接口定义,而不是类定义。
两件事:(1)我会等到我需要(或看到迫在眉睫的需要)一个替代实现,然后再创建接口;(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
}
}
希望这能说明问题。