Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用不同的构建器创建java子类型_Java_Oop_Builder_Solid Principles_Inversion - Fatal编程技术网

使用不同的构建器创建java子类型

使用不同的构建器创建java子类型,java,oop,builder,solid-principles,inversion,Java,Oop,Builder,Solid Principles,Inversion,我有一个类Foo,它有一个子类型subfo,还有一个生成器FooBuilder,它创建Foo对象 这就是Foo的样子: class Foo { protected Object superField; } subfo class SubFoo extends Foo { private Object subField; } 还有一些代码可以根据一些标准创建适当的生成器 FooBuilder create(){ return someCriterion ? new FooB

我有一个类
Foo
,它有一个子类型
subfo
,还有一个生成器
FooBuilder
,它创建
Foo
对象

这就是
Foo
的样子:

class Foo {
    protected Object superField;
}
subfo

class SubFoo extends Foo {
     private Object subField;
}
还有一些代码可以根据一些标准创建适当的生成器

FooBuilder create(){
 return someCriterion ? new FooBuilder() : new SubFooBuilder();
}
是否有一种方法或更改可以使生成器的客户端代码创建
Foo
subfo
对象,而不知道它使用哪个生成器?因为我不想打破依赖倒置原则。

我想你想要一个

首先,您需要为
Foo
对象声明一个接口,我们称之为
Foo

公共接口Foo{
公共方法();
}
其次,根据需要提供尽可能多的接口实现,例如
FooImpl1
FooImpl2
(与您的
Foo
subfo
相关)

公共类FooImpl1实现Foo{
公共方法(){
//第一个实现在这里
}
}
//注意:如果您愿意,这个类也可以扩展FooImpl1
公共类FooImpl2实现了Foo{
公共方法(){
//第二个实现在这里
}
}
接下来,为
Foo
工厂声明一个接口:

公共接口工厂{
公共Foo build();
}
现在,您可以创建任意数量的工厂:

公共类FooFactoryImpl1实现FooFactory{
公共FooImpl1构建(){
//创建并返回FooImpl1
}
}
公共类FooFactoryImpl2实现FooFactory{
公共FooImpl2构建(){
//创建并返回FooImpl2
}
}

使用这种方法,您的客户机代码只依赖于接口。您可以为它提供
FooFactory
的任何实现,这样客户端就不知道正在使用哪个工厂,也不知道
Foo
对象的实际实现。

如何使用
Foo
subfo
?它们有哪些共同的方法?它们将在以后的通用转换器中使用
class SubFooBuilder extends FooBuilder{
 protected Object subField;

 withSubField(Object field){
   this.subField = field;
 }

 Foo build(){
   return new SubFoo(superField, subField);
 }
}

FooBuilder create(){
 return someCriterion ? new FooBuilder() : new SubFooBuilder();
}