标签: builder-pattern

在用于GUI开发时,实现构建器模式的优秀示例是什么?

当涉及到工厂类和方法,模式等的使用时,我是一个完全新手 - 实际上我在浏览Java相关问题时首先在Stackoverflow上学到了它们:-)

为了回应我之前的一个问题,建议我在开发GUI的过程中研究Builder模型的使用,因此我正在寻找易于理解的示例,演示应用程序的用户界面如何使用此模式和方法链等

谢谢阅读.

java user-interface swing method-chaining builder-pattern

5
推荐指数
2
解决办法
1790
查看次数

Joshua Bloch的Builder模式和PMD警告

我使用Joshua Bloch的Builder模式编写了一个类,类似于这个Pizza示例:

public class Pizza {
  private int size;
  private boolean cheese;
  private boolean pepperoni;
  private boolean bacon;

  public static class Builder {
    //required
    private final int size;

    //optional
    private boolean cheese = false;
    private boolean pepperoni = false;
    private boolean bacon = false;

    public Builder(int size) {
      this.size = size;
    }

    public Builder cheese(boolean value) {
      cheese = value;
      return this;
    }

    public Builder pepperoni(boolean value) {
      pepperoni = value;
      return this;
    }

    public Builder bacon(boolean value) {
      bacon …
Run Code Online (Sandbox Code Playgroud)

java pmd builder-pattern

5
推荐指数
1
解决办法
5475
查看次数

如何有效地创建和使用构建器模式

在我们的最后一个项目中,我们最终得到了一个用于单元测试的共享测试夹具,这给出了很多问题.所以在我们当前的项目中,我已经研究了构建器模式.我们在开发机器上的内存中运行我们的单元测试,并在构建服务器上运行数据库.

目前我有一个T4模板,例如为学生生成以下构建器:

public class StudentBuilder : Builder<Student, StudentBuilder>
{
    public StudentBuilder()
    {
        IsMale = true;
    }

    public StudentBuilder WithFirstName(string firstName)
    {
        this.FirstName = firstName;
        return this;
    }

    public StudentBuilder WithLastName(string lastName)
    {
        this.LastName = lastName;
        return this;
    }

    public StudentBuilder WithIsMale(bool isMale)
    {
        this.IsMale = isMale;
        return this;
    }

    internal override Student Construct()
    {
        Student result = new Student()
        {
            FirstName = FirstName ?? "FirstName:" + id.ToString(),
            LastName = LastName ?? "LastName:" + id.ToString(),
            IsMale = IsMale,
            Id = id, …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing design-patterns builder-pattern

5
推荐指数
1
解决办法
2091
查看次数

有没有一种干净的方法来使用Builder模式来构建多级树?

如果您正在构建一些线性链(java的StringBuilder)或创建具有许多属性的对象(PizzaBuilder),那么构建器模式似乎很好.

是否可以扩展以构建一个树而不指定可能混淆的节点位置?

   a
 / | \
c  d  e
     / \
    f   g   

  TreeBuilder tb.addNode(levelNumber, parentNumber, nodeName) // I think this is terrible

  tb.addNode(2, 3, g)  //terrible
Run Code Online (Sandbox Code Playgroud)

或者这种模式不是一个好主意?

谢谢

java tree builder-pattern

5
推荐指数
2
解决办法
3769
查看次数

我该如何处理将Composite模式包装到Builder模式中?

让我们说我有一个复合设置如下:

public abstract class Element {
    //position, size, etc.

    //element methods

    //setters/getters
}

public class SimpleElement1 extends Element {
    //...
}

public class SimpleElement2 extends Element {
   //...
}

public class CompositeElement extends Element {
     protected List<Element> childrenElements;

     //methods to add/remove/get children
}
Run Code Online (Sandbox Code Playgroud)

现在,我将如何将这个Composite包装到Builder模式中,这样我就可以简化客户端代码,使其不关心(或者更少关心)如何将子项链接到Composite上的复杂性?

java oop design-patterns composite builder-pattern

5
推荐指数
1
解决办法
2589
查看次数

是否有可能隐藏lambda闭包的变量?

我正试图在Kotlin中创建一个类型安全的groovy式构建器,就像这里描述的那样.问题是嵌套lambda中lambda接收器的可见性.这是一个简单的例子.

html {
    head(id = "head1")
    body() {
        head(id = "head2")
    }
}
Run Code Online (Sandbox Code Playgroud)

嵌套lambda的接收者是没有'head'方法的Body.然而,这段代码编译并打印成:

<html>
    <head id="head1"></head>
    <head id="head2"></head>
    <body></body>
</html>
Run Code Online (Sandbox Code Playgroud)

这是预期的但有没有办法在内部头部获得编译错误?

lambda type-safety builder-pattern kotlin

5
推荐指数
1
解决办法
145
查看次数

在继承和杰克逊中使用lombok的@Builder

我正在尝试将lombok的@Builder与继承和Jackson一起使用。

我是从建筑的东西https://reinhard.codes/2015/09/16/lomboks-builder-annotation-and-inheritance/https://gist.github.com/pcarrier/14d3a8e249d804cfbdee建设者遗传模式

这是我所拥有的

UserInput.java

@JsonDeserialize(builder = UserInput.UserInputBuilder.class)
@Builder
@Data
public class UserInput {
    private int userId;
    private UsersChoice usersChoice;
    private ChoiceAttributes choiceAttributes;

    @JsonPOJOBuilder(withPrefix = "")
    public static final class UserInputBuilder {

    }

    public enum UserChoice {
          CHOICE1,
          CHOICE2
    }
}
Run Code Online (Sandbox Code Playgroud)

基于用户的选择,应使用相应的ChoiceAttributes构建器。

ChoiceAttributes.java

public abstract class ChoiceAttributes {
    //nothing to do here
    public static class ChoiceAttributesBuilder {
    }

    public static ChoiceAttributesBuilder getMeMyBuilderBasedOnUserChoice(UserChoice userChoice)
    {
       ChoiceAttributesBuilder choiceAttributesBuilder = null;
       switch(userChoice){
            case CHOICE1:
                choiceAttributesBuilder = new ChoiceAttributesForChoice1.ChoiceAttributesForChoice1Builder(); //err!! …
Run Code Online (Sandbox Code Playgroud)

java design-patterns builder-pattern jackson lombok

5
推荐指数
0
解决办法
641
查看次数

如何为具有许多不可变属性的 Kotlin 数据类创建构建器

我有一个 Kotlin 数据类,我正在使用许多不可变属性构建它,这些属性是从单独的 SQL 查询中获取的。如果我想使用构建器模式构造数据类,如何在不使这些属性可变的情况下执行此操作?

例如,而不是通过构建

var data = MyData(val1, val2, val3)
Run Code Online (Sandbox Code Playgroud)

我想用

builder.someVal(val1)
// compute val2
builder.someOtherVal(val2)
// ... 
var data = builder.build()
Run Code Online (Sandbox Code Playgroud)

同时仍然使用 Kotlin 的数据类功能和不可变属性。

builder-pattern kotlin

5
推荐指数
1
解决办法
4166
查看次数

方法调用中的参数太多

最近我在尝试写关于所请求参数数量的课程时被撕裂了.

一个非常简单的构造函数示例:

Burger(bun, meat, cheese, lettuce)
    this.bun = bun
    this.meat = meat
    ...
Run Code Online (Sandbox Code Playgroud)

VS

Burger(grocery)
    this.bun = grocery.bun
    this.meat = grocery.meat
    ...
Run Code Online (Sandbox Code Playgroud)

两种方式都是有效的方法.第一种方式准确地显示了进入汉堡的内容,将参数分解为更一般的类,因此它减少了耦合,我认为通常更容易测试,因为对象图更简单.

但第二种方式更简单,更清洁,也许汉堡可能需要更多的成分,然后第一种方式的争论可以大大增加.

我想知道在这种情况下推荐哪种方式?寻求更干净但更多耦合的代码,或更冗长的方式.

design-patterns builder-pattern

4
推荐指数
1
解决办法
1399
查看次数

Builder 模式对 Setter 方法有用吗?

所以我有一个带有 Hybris、Spring 等的 web 项目。

我有一些类,它们是自动生成的。假设我有一个模型类,它是自动生成的并从另一个类继承一些方法来设置字段。

在编写单元测试时,开始使用 Builder 模式有用吗?因为问题是,我没有构造函数,比如 Employee(int id, String name) 等等,我只有继承的方法来设置它们(setId(int id) 等等)。

例如,当我为这个模型编写一个 Builder 类时,我会使用 .withId(int id) 和 .withName(String name) 以及 build() 方法,我将在其中运行 setter 方法。

所以最后在我的测试课上我会有:

EmployeeBuilder eb = new EmployeeBuilder();
Employee emp = eb.withId(123)
                 .withName("John")
                 .build();
Run Code Online (Sandbox Code Playgroud)

但是因为我已经有了 Setter-Methods 我通常有:

Employee emp = new Employee();
emp.setId(123);
emp.setName("John");
Run Code Online (Sandbox Code Playgroud)

那么在这种情况下真的值得付出努力吗?还是有什么我没有真正理解的地方?

谢谢!

java testing design-patterns builder builder-pattern

4
推荐指数
2
解决办法
6845
查看次数