Java处理了很多具体的工厂

时间:2016-06-21 12:04:41

标签: java generics intellij-idea abstract-factory

我想为许多(~40-50)类似的实体推广重复的Java代码(在我的例子中,这篇文章是使用这些实体索引文件)。

我试图用泛型方法重构它,但是,结果,我得到了一个显然在Java中被禁止的泛型类的构造函数。为了避免这种情况,我实现了抽象工厂模式,这就是我得到的。

public <E extends CMObject, F extends IndexedFile<E>> F indexFile(CMFactory<E, F> factory) {
    F items;
    ByteBuffer[] buffs;

    // ...filling buffers...

    items = factory.makeFile(buffs); // as I cannot do items = new F(buffs)

    return items;
}

public CityFile getCities() {
    return indexFile(new CityFactory());
}

public ContinentFile getContinents() {
    return indexFile(new ContinentFactory());
}
// a lot of more

这解决了创建泛型类实例的问题。然而,我现在面临的任务是为每个单独的实体创建一个混凝土工厂,这些实体似乎是很单调的工作,因为它们看起来都像是彼此。

public abstract class CMFactory<E extends CMObject, F extends IndexedFile<E>> {
    public abstract F makeFile(ByteBuffer[] buff);
}

public class CityFactory extends CMFactory<City, CityFile> {
    @Override
    public CityFile makeFile(ByteBuffer[] buff) {
        return new CityFile(buff);
    }
}
public class ContinentFactory extends CMFactory<Continent, ContinentFile> {
    @Override
    public ContinentFile makeFile(ByteBuffer[] buffs) {
        return new ContinentFile(buffs);
    }
}

问题是:有没有办法自动化这些工厂的创建?或者是否有另一种模式至少可以使这种创作减少痛苦?

我尝试使用IntelliJ IDEA的Replace Constructor和Factory Method重构器,但它对我没有帮助。

1 个答案:

答案 0 :(得分:3)

由于CMFactory几乎是一个功能接口,因此您可以使用构造函数句柄,而不是为每个具体类实现CMFactory

使CMFactory成为界面:

public interface CMFactory<E extends CMObject, F extends IndexedFile<E>> {
    public abstract F makeFile(ByteBuffer[] buff);
}

然后写

public CityFile getCities() {
    return indexFile(CityFile::new);
}

您甚至可以放弃CMFactory并使用java.util.Function

public <E extends CMObject, F extends IndexedFile<E>> F indexFile(Function<ByteBuffer[],F> factory) {
    ByteBuffer[] buffs;
    // ...filling buffers...
    return factory.apply(buffs);
}