由于我没有java背景,因此我很难创建一个返回特定接口实现的工厂对象。类似的东西...
Factory.create();
其中create
应该返回一个接口。显然,create
需要知道我想要“创造”的东西。可以通过enum
传递,以便create
可以切换enum
的所有值并决定创建/返回的内容......我不知道究竟什么是最好的如何解决这个问题。
我试图解决的主要问题是提供与实现无关的解决方案,其中“工厂框架”的消费者不需要了解有关实现细节的任何信息。这使我可以更改实现类,甚至可以更换具体的实现,而无需重新考虑整个应用程序或系统。
我有以下界面
public interface EntityValidator<T> {
public boolean isValid(T t);
public List<String> getErrors();
}
到目前为止,有几个实现看起来像下面的类......
public class Foo implements EntityValidator<EntityA> {
private List<String> errors;
public boolean isValid(EntityA a){
///implementation details
}
public List<String> getErrors(){
return errors;
}
}
实际的例子有点复杂,因为涉及一个抽象类,但这超出了这个问题的范围。最后是工厂对象,这是我现在被困住的地方
public final class EntityValidatorFactory {
public static <T> EntityValidator<T> create(MyEnum value){
if(value == VALUE_X){
//THIS IS WHERE I'm stuck
}
}
}
我似乎找不到返回if
语句的方式(可能是switch
BTW)
有没有办法从实现它的具体类返回泛型接口,而不必手动将其转换为该接口?
任何解决方案都会受到赞赏,只要它在更改或交换实现类时不涉及更改使用代码。
答案 0 :(得分:1)
如Wikipedia article on the Factory pattern所示,为了制作工厂输出对象的不同具体版本,工厂本身应该是各种不同的工厂类。各种工厂类应该实现共享工厂接口或扩展共享工厂抽象超类。
顺便说一句,我已经看到用于工厂课程的动词make
坚持使用真实的物理工厂来制作东西的隐喻。您可能想要使用该词而不是“创建”。
答案 1 :(得分:0)
与编程中的任何内容一样,这是输入和输出的问题;你需要什么,你拥有什么。
你需要什么取决于你,对于初学者来说,你显然需要一种方法来确定你实例化的类型,所以我们可以从那里开始:
public <T> T create(Class<T> type) {
//make T
}
从那里,您需要确定实例化的标准,是否需要绑定T(如T extends MyInterface
),或使用反射并具有预定义的构造函数/零参数构造函数。您还可以拥有一个Map<String, Object>
,其中包含创建对象的参数;这真的取决于你。最后一点是,您只需要决定制作对象的方法,并且如果要打造“多类型”工厂,则保持该标准的一致性。
但是,对于大多数情况,您只需为所需的特定对象创建方法,而不是自己传递类型(多个Factory类型)。根据经验,工厂有两种形式:
通过为您选择正确的子类来隐藏实现细节的类
处理实例化并控制对象引用的类
所以你真的有很多灵活性。