当涉及到工厂类和方法,模式等的使用时,我是一个完全新手 - 实际上我在浏览Java相关问题时首先在Stackoverflow上学到了它们:-)
为了回应我之前的一个问题,建议我在开发GUI的过程中研究Builder模型的使用,因此我正在寻找易于理解的示例,演示应用程序的用户界面如何使用此模式和方法链等
谢谢阅读.
我使用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) 在我们的最后一个项目中,我们最终得到了一个用于单元测试的共享测试夹具,这给出了很多问题.所以在我们当前的项目中,我已经研究了构建器模式.我们在开发机器上的内存中运行我们的单元测试,并在构建服务器上运行数据库.
目前我有一个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) 如果您正在构建一些线性链(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)
或者这种模式不是一个好主意?
谢谢
让我们说我有一个复合设置如下:
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上的复杂性?
我正试图在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)
这是预期的但有没有办法在内部头部获得编译错误?
我正在尝试将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) 我有一个 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 的数据类功能和不可变属性。
最近我在尝试写关于所请求参数数量的课程时被撕裂了.
一个非常简单的构造函数示例:
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)
两种方式都是有效的方法.第一种方式准确地显示了进入汉堡的内容,将参数分解为更一般的类,因此它减少了耦合,我认为通常更容易测试,因为对象图更简单.
但第二种方式更简单,更清洁,也许汉堡可能需要更多的成分,然后第一种方式的争论可以大大增加.
我想知道在这种情况下推荐哪种方式?寻求更干净但更多耦合的代码,或更冗长的方式.
所以我有一个带有 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)
那么在这种情况下真的值得付出努力吗?还是有什么我没有真正理解的地方?
谢谢!