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

标签 java oop builder solid-principles inversion

我有课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原理。

最佳答案

我想你想要一个Abstract factory

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

public interface Foo {
    public void fooMethod();
}

其次,提供任意数量的接口(interface)实现,例如 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 工厂的接口(interface):

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
    }
}

通过这种方法,您的客户端代码仅依赖于接口(interface)。您可以为其提供 FooFactory 的任何实现,这样客户端就无法知道到底使用的是哪个工厂,以及 Foo 对象的真正实现。

关于java - 使用不同的构建器创建 java 子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59320354/

相关文章:

java - Java 中的 "static{}"是什么?

Java OOP - 学习数组元素实例,用于模拟人类生活......交配和新生

c# - 使用抽象类创建复制构造函数

Hudson、CDash、CruisonControl、TeamCity 的持续集成/构建器比较

Java,如何将十进制数作为字符串转换为整数

java - Liberty OpenId 连接错误 403 : AuthorizationFailed

java - 显示列表的应用程序不起作用

java - Lombok 构建器包范围

Java:如何处理 "almost"不可变数据结构?

java - Spring-Security:使用自定义身份 validator 和自定义登录页面