当前位置: 首页 > 面试题库 >

构建器模式和大量强制性参数

宰父淳
2023-03-14
问题内容

到目前为止,我使用了构建器模式的以下实现(与此处描述的实现相反):

public class Widget {
    public static class Builder {
        public Builder(String name, double price) { ... }
        public Widget build() { ... }
        public Builder manufacturer(String value) { ... }
        public Builder serialNumber(String value) { ... }
        public Builder model(String value) { ... }
    }

    private Widget(Builder builder) { ... }
}

这在我遇到的大多数情况下都很有效,在这种情况下,我需要使用各种必需/必需和可选参数来构建一个复杂的对象。但是,最近我一直在努力了解当所有参数都是必需的(或者至少绝大多数是强制性的)时,模式有什么好处。

解决此问题的一种方法是在逻辑上将传递给它们自己的类的参数分组,以减少传递给构建器构造函数的参数数量。

例如,代替:

Widget example = new Widget.Builder(req1, req2, req3,req4,req5,req6,req7,req8)
                           .addOptional(opt9)
                           .build();

分为以下几类:

Object1 group1 = new Object1(req1, req2, req3, req4);
Object2 group2 = new Object2(req5, req6);

Widget example2 = new Widget.Builder(group1, group2, req7, req8)
                            .addOptional(opt9)
                            .build();

虽然使用单独的对象可以使事情简化很多,但是如果不熟悉代码,也会使操作变得有些困难。我考虑的一件事是将所有参数移到他们自己的addParam(param)方法中,然后对build()方法中所需的参数执行验证。

什么是最佳实践?也许我没有考虑过更好的方法?


问题答案:

但是,最近我一直在努力了解当所有参数都是强制性参数(或至少绝大多数参数都是强制性参数)时,模式有什么好处。

流利的构建者模式仍然是有益的:

  1. 它更具可读性-它有效地允许使用命名参数,因此调用不仅是一长串未命名参数

  2. 它是无序的-这使您可以将参数分组为逻辑组,既可以作为单个构建器设置器调用的一部分,也可以简单地让您使用自然顺序来调用使该特定实例最有意义的构建器设置器方法。

Widget example = new Widget.Builder(req1, req2,

req3,req4,req5,req6,req7,req8)
.addOptional(opt9)
.build();

分为以下几类:

Object1 group1  = new Object1(req1, req2, req3, req4);
Object2 group2  = new Object2(req5, req6);
Widget example2 = new Widget.Builder(group1, group2, req7, req8)
                            .addOptional(opt9)
                            .build();

虽然使用单独的对象可以使事情简化很多,但是如果不熟悉代码,也会使操作变得有些困难。我考虑的一件事是将所有参数移到他们自己的addParam(param)方法中,然后对build()方法中所需的参数执行验证。

在适当或自然的情况下,我会倾向于混合动力。它不必是所有构造函数
每个PARAM都有自己addParam方法。使用Builder,您可以灵活地在两者之间或两者之间进行组合:

Widget.Builder builder = new Widget.Builder(Widget.BUTTON);

builder.withWidgetBackingService(url, resource, id);
builder.withWidgetStyle(bgColor, lineWidth, fontStyle);
builder.withMouseover("Not required");

Widget example = builder.build();


 类似资料:
  • 如果我将@builder添加到类中。创建生成器方法。 lombok是否提供了其他技术来实现以下目标: 注意:不应公开builder()和name()。创建Person对象的唯一方法应该在上面或下面:

  • 由于无法解析最后一个链接调用,未定义方法,因此此调用将不会编译。所以这种方式要求所有调用都以特定的顺序链接起来,这是非常不切实际的,特别是对于一个深度层次结构树。 现在,在我寻找答案的过程中,我遇到了一个Java Builder类的子类,它建议使用奇怪的递归泛型模式。但是,由于我的层次结构不包含一个抽象类,所以这个解决方案对我不起作用。但是这种方法依赖于抽象和多态性来发挥作用,这就是为什么我不相信

  • 我需要在没有静态嵌套类的情况下实现Builder模式。如果我有遗传,最好的方法是什么?让我们想象一下我有下面的课。 是创建一个Builder类来负责设置PassengerCar和Truck的值更好,还是我们需要另外三个类,CarBuilder,PassengerCarBuilder extends CarBuilder和TruckBuilder extends CarBuilder?

  • 本文向大家介绍设计模式构建器模式/Java 实现,包括了设计模式构建器模式/Java 实现的使用技巧和注意事项,需要的朋友参考一下 示例 通过Builder模式,您可以以易于阅读的方式创建具有许多可选变量的类的实例。 考虑以下代码: 如果所有参数都是必需的,那么一切都很好。如果有更多的变量和/或其中一些是可选的怎么办?您不想使用必需参数和可选参数的每种可能的组合来创建大量的构造函数,因为它变得难以

  • 我正在计算非负p的Lp距离函数。除了p=0和p=∞ 内置的pow()函数可以很好地发挥作用。在学习结构模式匹配之前,我使用了字典和异常处理: 有些人不希望这里有例外。因此,我将该片段改写为以下内容: 为什么大小写inf不正确(Python v3.10.2)?

  • 本文向大家介绍多态性的类型-临时,包含,参数和强制,包括了多态性的类型-临时,包含,参数和强制的使用技巧和注意事项,需要的朋友参考一下 在这里,我们将看到不同类型的多态性。类型是- 特别指定 包容性 参数 强迫 Ad-Hoc多态称为超载。这允许具有相同名称的函数针对不同类型以不同的方式起作用。函数和运算符都可以重载。某些语言不支持运算符重载,但是函数重载是常见的。 示例 输出结果 包含多态性称为子