使用不同的构建器创建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();
}