Java 调用工厂而不强制转换返回类型
这是我第一次尝试建立工厂。。如果我没有正确使用图案,请原谅 这就是我的工厂:Java 调用工厂而不强制转换返回类型,java,generics,casting,factory,builder,Java,Generics,Casting,Factory,Builder,这是我第一次尝试建立工厂。。如果我没有正确使用图案,请原谅 这就是我的工厂: public class BuilderFactory { public BuilderFactory(){ } public <T extends Builder> T getBuilderOf(Object clazz){ if(clazz instanceof House){ return
public class BuilderFactory {
public BuilderFactory(){
}
public <T extends Builder> T getBuilderOf(Object clazz){
if(clazz instanceof House){
return (T) new HouseBuilder();
}
return null;
}
}
现在可以做到:
builderFactory.getBuilderOf(House.class).build();
因为build()
在Builder
界面中。但如果我想这样做:
builderFactory.getBuilderOf(House.class).withStreet(“street”)代码>
我隐含地需要像这样对构建器进行转换:
(HouseBuilder)builderFactory.getBuilderOf(House.class).withStreet("street")
否则编译器会抱怨
我不想强制转换它,也不想从工厂实例化我的返回值。是否有任何选项可以使我不必强制转换结果,并且仍然可以使用.withStreet()
方法:)
提前谢谢。
戴维为什么要费心研究仿制药
您的工厂明确需要了解混凝土建筑商(return(T)new HouseBuilder()
)
您的客户机需要明确地传递正确的类型(House.class
),显然您希望它知道该类型,因为客户机使用的方法特定于混凝土生成器(withStreet
)
因此,只需将工厂方法具体化:
public HouseBuilder getHouseBuilder() {
return new HouseBuilder();
}
由于您的实现非常通用,如果您想添加细节,您也需要对这些细节进行通用
public interface Instruction {
public String getDescription();
}
public StreetInstruction implements Instruction {
String street;
public StreetInstruction (String street) {
this.street = street;
}
}
public interface Builder<T> {
T build(Instruction ... instructions);
}
builderFactory.getBuilderOf(House.class).build(new StreetInstruction("Sesame"));
公共接口指令{
公共字符串getDescription();
}
公共街道教学实施教学{
弦街;;
公共街道说明(字符串街){
这条街;
}
}
公共界面生成器{
T构建(指令…指令);
}
builderFactory.getBuilderOf(House.class).build(新街道说明(“芝麻”);
现在有很多方法可以做到这一点,但这可能是其中之一。但是,我认为您遇到的问题是,不同类型的对象将有非常不同的实现。因此,你的工厂也可以按照你的方式制造家具。如果是这样的话,你会怎样告诉建筑商你想要的是沙发而不是椅子?你要做的事情没有错,你可能只是想考虑一下你的范围。如果你不得不贬低你的构建者,你就做错了。所有内容都应该在Builder
界面中BuilderFactory
似乎有点多余。我能理解你的意思,但构建者有一个共同点,那就是build()。除此之外,每个构建者构建它们的方式各不相同只要忘记你的BuilderFactory
,使用FooBuilder
或FooFactory
(用你想要构建的任何东西替换Foo
)(意味着有不同的Foo
实现,或者Foo
构建起来很复杂)。否则new Foo()
即使在2014年也非常有效。我将从很多地方调用此工厂,很可能我还必须向生成器构造函数添加参数。我宁愿让工厂注入参数,而不是调用新的Foo(1、2、3)如果没有不同的HouseBuilder
实现,每次都要彻底清除工厂。我考虑过这一点,但是我必须为每个新的构建者创建一个返回类型。我想避免这种情况,并创建一种通用方法。我要补充的是,如果有多种类型的HouseBuilder
,那么n界面更合适:IHouseBuilder
可以将WoodHouseBuilder
或BrickHouseBuilder
作为实现。谢谢,睡了一夜之后,我认为这是最好的解决方案。是的,我明白你的意思。谢谢这个例子,范围太大,工厂不够通用。我认为上面那个家伙说,建造混凝土工厂是解决这个问题的办法。非常感谢!
(HouseBuilder)builderFactory.getBuilderOf(House.class).withStreet("street")
public HouseBuilder getHouseBuilder() {
return new HouseBuilder();
}
public interface Instruction {
public String getDescription();
}
public StreetInstruction implements Instruction {
String street;
public StreetInstruction (String street) {
this.street = street;
}
}
public interface Builder<T> {
T build(Instruction ... instructions);
}
builderFactory.getBuilderOf(House.class).build(new StreetInstruction("Sesame"));