Java接口实现工厂对象

时间:2016-11-05 05:35:00

标签: java design-patterns factory

背景

由于我没有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)

问题

有没有办法从实现它的具体类返回泛型接口,而不必手动将其转换为该接口?

任何解决方案都会受到赞赏,只要它在更改或交换实现类时不涉及更改使用代码。

2 个答案:

答案 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类型)。根据经验,工厂有两种形式:

  1. 通过为您选择正确的子类来隐藏实现细节的类

  2. 处理实例化并控制对象引用的类

  3. 所以你真的有很多灵活性。