具有扩展抽象类的类型的工厂模式通用接口

时间:2013-12-11 18:43:05

标签: java oop factory-pattern

好的,我希望我不要试图在这里实现不可能。

我有一个抽象类abstract class MathFunc,用于在特定类final class Rastrigin extends MathFuncfinal class Griewangk extends MathFuncfinal class Rosenbrock extends MatjFunc中实现Rastrigin,Griewangk和Rosenbrock的数学函数。

我需要一个包含ArrayList的Generation类,它必须包含几个Rastrigin / Griewangk / Rosenbrock类型的对象。这些对象应该彼此分开实例化,因为Rastrigin / Griewangk / Rosenbrock在它们的构造函数中生成应该保持随机的随机数。

从我之前的问题here我设法实现了一个完全初始化的版本,但是通过ArrayList重复了相同的Rastrigin(例如)对象。根据那里给出的答案,我理解我应该使用Factory模式分别实例化每个对象。从答案中我得到了这段代码:

interface MathFuncFactory <T extends MathFunc()>{
       T createFunc();
}

但它不起作用。如何正确实施此设计并使其按照我希望的方式工作?还有可能在我的Generation类中实例化一个T类型的对象吗?我是java的新手,所以详细的解释非常感谢。

P.S。我做了第二个答案,因为它与最初的问题无关,即java中泛型类的使用。

2 个答案:

答案 0 :(得分:1)

您的代码中有两个错误:

1)()

之后您不需要extends MathFunc

2)abstract方法也应标有abstract关键字

abstract class MathFuncFactory <T extends MathFunc> {
    abstract T createFunc();
}

关于您已关联的答案,您不需要接口的abstract关键字:

interface MathFuncFuncFactory<T extends MathFunc> {
    T createFunc();
}

答案 1 :(得分:1)

您无法直接实例化T等类型参数。相反,您希望Generation接受工厂,以便您可以在循环的每次迭代中创建一个新实例:

interface MathFuncFactory<T extends MathFunc> {
    T create();
}

class Generation<T extends MathFunc> {

    Generation(MathFuncFactory<T> factory) {
        for (...) {
            list.add(factory.create());
        }
    }
}

然后您可以为特定函数创建Generation,如下所示:

new Generation(new MathFuncFactory<Rastrigin>() {
    public Rastrigin create() {
        return new Rastrigin();
    }
});

拥有一个可以建造这些工厂的课程可能是有益的:

class MathFuncs {

    private MathFuncs() {}

    static MathFuncFactory<Rastrigin> rastrigin() {
        return new MathFuncFactory<Rastrigin>() {
            public Rastrigin create() {
                return new Rastrigin();
            }
        }
    }

    static Generation<Rastrigin> rastriginGeneration() {
        return new Generation<Rastrigin>(rastrigin());
    }
}

所以你可以直接打电话

new Generation(MathFuncs.rastrigin())

或只是

MathFuncs.rastriginGeneration()