【问题标题】:Java Pattern to build object where any one field must be set?Java模式构建必须设置任何一个字段的对象?
【发布时间】:2013-06-05 06:34:32
【问题描述】:

我需要构建具有 3 个字段的类的对象:A、B 和 C。有效对象至少具有用户设置的 A、B 或 C 之一。我查看了Builder Pattern,这与我想要的很接近,但只有一个字段是强制性的。我希望必须将 1 字段设置为我拥有的 3 个字段中的任何一个。有什么建议吗?

我的替代方法是使用 7 个构造函数(用于 {A}、{B}、{C}、{A,B}、{B,C}、{A,C}、{A,B,C})

【问题讨论】:

  • "但是必须设置的字段不能更改"
  • 构建器模式实际上让您在构建实际对象之前确定您传递的构建器选项是否有效,我在这里看不到问题。例如:new Bulder().withA(a).build() 成功,new Builder().build() 失败
  • 谢谢。我不知道。

标签: java class design-patterns builder builder-pattern


【解决方案1】:

可以为此使用构建器。只有两个字段而不是三个字段的简短示例:

public final class MyBuilder
{
    private X a, b;

    public MyBuilder withA(X a)
    {
        b = null;
        this.a = a;
        return this;
    }

    public MyBuilder withB(X b)
    {
        a = null;
        this.b = b;
        return this;
    }

    public MyClass build()
    {
        if (a == null && b == null)
            barf(); // <-- throw exception here
        // A and B inherit MyClass
        return a != null ? new A(a) : new B(b);
    }
}

【讨论】:

  • 谢谢。我不应该对 Builder 模式做一个敷衍的研究。
  • 你甚至可以做得更好......建造者模式非常强大
【解决方案2】:

您可以强制在 build() 方法中传递 A、B 或 C:

class ValidBuilder {
  public ValidBuilder withA(Object a) {}
  public ValidBuilder withB(Object b) {}
  public ValidBuilder withC(Object c) {}

  public ValidObject buildA(Object a) { }
  public ValidObject buildB(Object b) { }
  public ValidObject buildC(Object c) { }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2019-06-23
    • 2018-01-01
    • 1970-01-01
    • 2021-09-01
    • 2012-02-23
    相关资源
    最近更新 更多