我是第一次尝试制作工厂..如果我没有正确使用模式,请原谅我!
所以这是我的工厂:
public class BuilderFactory {
public BuilderFactory(){
}
public <T extends Builder> T getBuilderOf(Object clazz){
if(clazz instanceof House){
return (T) new HouseBuilder();
}
return null;
}
}
它将返回一个具有 Builder 接口(interface)的构建器(在本例中为 HouseBuilder)。
build 者:
public interface Builder<T> {
T build();
}
建房者:
public class HouseBuilder implements Builder<House> {
private String street;
public HouseBuilder() {
}
@Override
public House build() {
return new House(street);
}
@Override
public HouseBuilder<House> withStreet(String street) {
this.street = street;
return this;
}
}
这是我称之为的地方:
BuilderFactory builderFactory = new BuilderFactory();
现在可以做到:
builderFactory.getBuilderOf(House.class).build();
因为 build()
是在 Builder
接口(interface)中。但如果我想这样做:
builderFactory.getBuilderOf(House.class).withStreet("街道");
我隐含地需要像这样转换构建器:
(HouseBuilder)builderFactory.getBuilderOf(House.class).withStreet("street")
否则编译器会报错。
我不想转换它,也不想从工厂实例化我的返回值。有没有我不必强制转换结果并且仍然可以使用 .withStreet()
方法的选项? :)
提前致谢。 戴维
最佳答案
为什么要为泛型烦恼?
您的工厂明确需要知 Prop 体的 builder (return (T) new HouseBuilder()
)。
您的客户端明确需要传递正确的类型 (House.class
),显然您希望它知道该类型,因为客户端使用特定于具体构建器的方法 (withStreet
).
所以只需将工厂方法具体化即可:
public HouseBuilder getHouseBuilder() {
return new HouseBuilder();
}
关于java - 在不对返回类型进行类型转换的情况下调用工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22336205/