2013-12-11 46 views
0

好的,我希望我不会尝试在这里实现不可能的事情。扩展抽象类的工厂模式通用接口

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

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

从我以前的问题here我设法实现一个版本,开始完全初始化,但通过ArrayList重复相同的Rastrigin(例如)对象。从那里给出的答案我明白,我应该使用工厂模式分别实例化每个对象。从答案我有这块代码:

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

但它不起作用。我怎样才能正确实施这个设计,并按照我希望的方式进行工作?也可以在我的Generation类中实例化T类型的对象吗?我是一个在java中的新手,非常感谢你的详细解释。

p.s.我做了第二个答案,因为它与Java中泛型类的使用最初的问题并不相关。

回答

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() 
+0

事实上,我对那里遗忘的抽象是错误的。我的问题是:使用'MathFuncs()'类可以在Generation中实例化新的Rastrigin对象吗? – Edeph

+0

另外'返回新的MathFuncFactory()'抛出一个错误,因为它说它是匿名的 – Edeph

+1

你想要做的是给'Generation'一个实例化新的'Rastrigin'对象的方法,这种方式就是'MathFuncFactory'。所以,你将一个工厂传递给'Generation'的构造函数,然后'Generation'在该工厂调用'create()',然后实际实例化新的'Rastrigin'。 –

1

你在你的代码的两个错误:

1)你不需要()extends MathFunc

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

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

有关到您所链接的答案,您不需要abstract关键字的接口:

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

事实上我错了与抽象,但凯尔弗朗西斯提供的,似乎注定了我的想法这种设计模式确切的方法。 – Edeph