Java 与很多混凝土工厂打交道
Java dealing with a lot of concrete factories
我想为很多 (~40-50) 个相似的实体概括一段重复的 Java 代码(在我的例子中,这段代码是使用这些实体的文件索引)。
我试图用泛型方法重构它,但结果,我得到了一个泛型 class 的构造函数,这在 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
这解决了创建泛型 class 实例的问题。然而,我现在面临着为每个实体创建一个具体工厂的任务,这似乎是一项单调的工作,因为它们看起来都很像。
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 with Factory Method 重构,但它没有帮助我。
由于您的 CMFactory
几乎是一个功能接口,您可以使用构造函数句柄而不是为每个具体 class:
实现 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);
}
我想为很多 (~40-50) 个相似的实体概括一段重复的 Java 代码(在我的例子中,这段代码是使用这些实体的文件索引)。
我试图用泛型方法重构它,但结果,我得到了一个泛型 class 的构造函数,这在 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
这解决了创建泛型 class 实例的问题。然而,我现在面临着为每个实体创建一个具体工厂的任务,这似乎是一项单调的工作,因为它们看起来都很像。
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 with Factory Method 重构,但它没有帮助我。
由于您的 CMFactory
几乎是一个功能接口,您可以使用构造函数句柄而不是为每个具体 class:
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);
}