Tag: builder pattern

Builder模式:首选哪种变体?

我正在阅读Effective Java书籍,并为我将来的参考创建笔记,我遇到了Builder Pattern。 嗯,我明白它是什么以及如何使用它。在这个过程中,我创建了构建器模式的两个示例变体。 我需要帮助列出每个人的差异和优势吗? 我当然注意到, Example 1暴露了较少的方法,通过较少限制和更通用,允许它更灵活地使用。 请指出我错过的其他事情? 例1 package item2; /** * @author Sudhakar Duraiswamy * */ public class Vehicle { private String type; private int wheels; interface Builder{ public T build(); } public static class CarBuilder implements Builder{ private String type; private int wheels; CarBuilder createVehicle(){ this.type= “Car”; return this; } CarBuilder […]

Builder模式与配置对象

构建器模式在创建不可变对象时很流行,但是创建构建器会产生一些编程开销。 所以我想知道为什么不简单地使用配置对象。 构建器的用法如下所示: Product p = Product.Builder.name(“Vodka”).alcohol(0.38).size(0.7).price(17.99).build(); 很明显,这是非常易读和简洁的,但您必须实现构建器: public class Product { public final String name; public final float alcohol; public final float size; public final float price; private Product(Builder builder) { this.name = builder.name; this.alcohol = builder.alcohol; this.size = builder.size; this.price = builder.price; } public static class Builder { private String name; private float […]

如何在我的ModelInput类中使用Joshua Bloch的版本描述的Builder模式?

我正在尝试使用Builder Pattern为我的下面的类。最初我使用我的类的构造函数来设置所有参数但不小心我遇到了Builder模式,它看起来很适合我的用例。 下面是我的类,其中人们将主要传递userId , clientId和parameterMap但其他字段是可选的,它们可能会也可能不会传递它。 而且如果他们没有传递任何超时值,我需要将默认超时值设置为500,但如果他们传递任何超时值,那么它应该覆盖我的默认超时值。 这里Preference是一个有四个字段的ENUM。 public final class ModelInput { private long userid; private long clientid; private long timeout = 500L; private Preference pref; private boolean debug; private Map parameterMap; public ModelInput(long userid, long clientid, Preference pref, Map parameterMap, long timeout, boolean debug) { this.userid = userid; this.clientid = clientid; this.pref = pref; […]

如何克隆旧构建器以创建新的构建器对象?

我有一个我正在我的项目中使用的构建器类。 假设我将metricA作为基于以下类的构建器。 我需要通过克隆metricA来制定基于metricA的新构建器metricB ,以便metricB包含metricB中已经存在的所有值。 在MetricHolder的构造函数中,我正在基于已经设置的字段初始化一些字段(不是直接设置)。 clientTypeOrPayId – 我正在初始化此字段。 如果payId存在,那么我将设置此值或我将设置clientType 。 clientKey – 我也在同一个构造函数中初始化这个字段。 最重要的是,我在clientPayload地图中放置了几个必填字段。 我不确定这样做的正确方法是什么。 但我需要在地图中添加is_clientid和is_deviceid 。 (一般来说,我添加了更多的字段)。 然后在构造函数的最后一个,我计算延迟差异并将其发送到其他系统。 以下是我的课程: public final class MetricHolder { private final String clientId; private final String deviceId; private final String payId; private final String clientType; private final String clientTypeOrPayId; private final Schema schema; private final String schemaId; private final […]

将构建器保持在单独的类中(流畅的界面)

Foo foo = Foo.builder() .setColor(red) .setName(“Fred”) .setSize(42) .build(); 所以我知道在调用方法时有以下“Builder”解决方案用于创建命名参数。 虽然,这似乎只适用于内部静态类作为构建器,或者我错了吗? 我看了一些构建器模式的教程,但是对于我想要做的事情,它们看起来非常复杂。 有没有办法让Foo类和Builder类分开,同时享受上述代码等命名参数的好处? 以下是典型设置: public class Foo { public static class Builder { public Foo build() { return new Foo(this); } public Builder setSize(int size) { this.size = size; return this; } public Builder setColor(Color color) { this.color = color; return this; } public Builder setName(String […]