java工厂方法和泛型

时间:2014-12-10 01:18:44

标签: java generics factory

我今天一直在清理我的一些代码,其中涉及制作几个工厂类,用于从用户输入动态创建不同的类。我发现他们都遵循几乎相同的模式:

public class MyClassFactory{
    private static MyClassFactory singleton = new MyClassFactory();
    public static MyClassFactory getInstance(){return singleton;}
    private MyClassFactory();
    private HashMap<String, Class<? extends MyClass>> instances = new HashMap<>();

    public void register(String name, Class<? extends MyClass> clazz){
        instances.put(name, clazz);
    }

    public MyClass getByName(String name) throw ...{
        return instances.get(name).newInstance();
    }
}

我的问题是这个,我不应该为此创建一个超类,我可以将类类型作为泛型传递。像这样:

public class SimpleFactory T<Class>{
    private HashMap<String, Class<T>> instances = new HashMap<>();

    public void register(String name, Class<? extends T> clazz){
        instances.put(name, clazz);
    }
    //or possibly public <T> T getByName....
    public T getByName(String name) throw ...{
        return instances.get(name).newInstance();
    }
}

public class MyClassFactory extends SimpleFactory<MyClass.class>{
    private static MyClassFactory singleton = new MyClassFactory();
    public static MyClassFactory getInstance(){return singleton;}
    private MyClassFactory();
}

不幸的是,我在整个MyClassFactory类中得到了编译错误,它似乎是由MyClass.class和sates“错误的参数数量,需要1”。

这可能/值得吗?

2 个答案:

答案 0 :(得分:2)

首先,您在SimpleFactory类声明的开头行上有一个拼写错误。我想你正在寻找像

这样的东西
public class SimpleFactory<T> {

然后子类将是

public class MyClassFactory extends SimpleFactory<MyClass> {

考虑使基类抽象化。

顺便说一句,如果你的应用程序很大程度上依赖于单身人士并且有任何复杂性,或者将继续增加复杂性,那么请考虑使用像Spring或Guice这样的IOC容器。我个人是春天的粉丝。有人抱怨它的复杂性,但它有模块,你不必使用一切。我的两分钱。

答案 1 :(得分:0)

你的语法非常错误。我不是100%肯定你在追求什么,但以下工作正常:

public class SimpleFactory<T> {
    private HashMap<String, Class<? extends T>> instances = new HashMap<>();

    public void register(String name, Class<? extends T> clazz){
        instances.put(name, clazz);
    }
    //or possibly public <T> T getByName....
    public T getByName(String name) throws ... {
        return instances.get(name).newInstance();
    }
}

public class MyClassFactory extends SimpleFactory<MyClass> { ... }