默认情况下,为域对象工厂使用接口是否有意义,或者只有在需要时才为工厂类保留接口?
public IUserFactory
{
User CreateNewUser();
}
public UserFactory : IUserFactory
{
public User CreateNewUser()
{
return new User();
}
}
答案 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
}
}
希望这可以解决问题。