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

我有一个类Foo,它的子类型为SubFoo,我有一个生成器FooBuilder,它创建了Foo对象。

Foo的外观如下:

class Foo {
    protected Object superField;
}

SubFoo

class SubFoo extends Foo {
     private Object subField;
}
class FooBuilder {
 protected Object superField;

 withSuperField(Object field){
   this.superField = field;
 }

 Foo build(){
   return new Foo(superField);
 }
}
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();
}

是否有一种方法或要进行的更改,以使构建器的客户代码创建一个FooSubFoo对象,而不知道它使用哪个构建器?因为我不想违反Dependency inversion原则。

d21qgu9p 回答:使用不同的构建器创建Java子类型

我认为您想要一个Abstract factory

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

public interface Foo {
    public void fooMethod();
}

第二,根据需要提供尽可能多的接口实现,例如FooImpl1FooImpl2(与您的FooSubFoo相关)

public class FooImpl1 implements Foo {
    public void fooMethod() {
        //first implementation goes here
    }
}

//NOTE: this class can also extend FooImpl1,if you wish
public class FooImpl2 implements Foo {
    public void fooMethod() {
        //second implementation goes here
    }
}

接下来,为Foo工厂声明一个接口:

public interface FooFactory {
    public Foo build();
}

现在您可以根据需要创建任意数量的工厂:

public class FooFactoryImpl1 implements FooFactory {
    public FooImpl1 build() {
        // create and return FooImpl1
    }
}

public class FooFactoryImpl2 implements FooFactory {
    public FooImpl2 build() {
        // create and return FooImpl2
    }
}

使用这种方法,您的客户端代码仅取决于接口。您可以向其提供FooFactory的任何实现,因此客户端不知道确切使用了哪个工厂以及Foo对象的实际实现。

本文链接:https://www.f2er.com/2927973.html

大家都在问