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"));