我常常发现使用pre-java-8设置实现构建器模式很繁琐.总是有很多几乎重复的代码.构建器本身可以被视为样板.
事实上,有代码重复检测器,几乎可以考虑使用pre-java-8工具制作的构建器的每个方法作为每个其他方法的副本.
所以考虑下面的类和它的pre-java-8构建器:
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class PersonBuilder {
private static class PersonState {
public String name;
public int age;
}
private PersonState state = new PersonState();
public PersonBuilder withName(String name) {
state.name = name;
return this; …Run Code Online (Sandbox Code Playgroud) 我正在学习设计模式并找到了Builder设计模式.这种设计模式有什么好处,我什么时候应该使用它?我浏览www.dofactory.com和www.blackwasp.com,但仍然不了解其好处.顺便说一下,我是设计模式的新手,所以请用简单的方法解释一下.
以下哪项是实施构建器模式的更好方法?
1)使用对象构建而不是构建器中的所有属性(并在构建器构造器中创建它):
public class Person {
private String firstName;
// other properties ...
private Person() {}
// getters ...
public static class Builder {
// person object instead of all the person properties
private Person person;
public Builder() {
person = new Person();
}
public Builder setFirstName(String firstName) {
person.firstName = firstName;
return this;
}
// other setters ...
public Person build() {
if (null == person.firstName) {
throw new IllegalStateException("Invalid data.");
}
return person;
}
}
}
Run Code Online (Sandbox Code Playgroud)
2)直接在构建器中使用对象的属性来构建而不是对象(并在build()方法中创建它):
public …Run Code Online (Sandbox Code Playgroud) 我想看看Builder模式在现实世界的应用程序/ API中是如何使用的.我发现的例子包括比萨饼,蛋糕,汽车等等(加上GoF书中的解析器示例).
你能否告诉我这个模式在实际应用程序/ API中的一些用法,最好是来自C++,.NET或PHP的世界(因为那些是我熟悉的语言).
谢谢.
模板模式在基类中提供算法,其步骤可以在派生类中进行修改.在Builder模式中,具体构建器公开了用于构建从Director类调用的产品的方法.
我知道使用这些模式的目的有所不同.模板模式是一种行为模式,它改变模板中的一个或多个步骤,而构建器模式是创建模式.
除了上述差异外,还有其他差异吗?
构建器模式中的director不是模板模式中的基本模板.具体的构建器在模板模式中的行为类似于可替换的步骤吗?
有人可以澄清一下.谢谢.
为什么不
AlertDialogBuilder builder = new AlertDialogBuilder(this);
builder.setTitle("foo");
Run Code Online (Sandbox Code Playgroud)
代替
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("foo");
Run Code Online (Sandbox Code Playgroud)
更新:我想知道这种写作/组织背后的原因
我有3个班:
哪里
ShellError extends Error
Run Code Online (Sandbox Code Playgroud)
和
WebError extends Error
Run Code Online (Sandbox Code Playgroud)
在ShellError某些领域中,有些领域是可选的,而其他领域则是必需的.我正在以下列方式构建对象:
shellError = new ShellError.Builder().setFile(filePattern)
.setHost(host).setPath(path).setSource(file.isSource())
.setJobName(p.getJobName()).build();
Run Code Online (Sandbox Code Playgroud)
自从ShellError延伸以来Error,我进一步:
shellError.setDescription(msg.toString());
shellError.setExceptionClass("MyEvilException");
shellError.setExceptionMessage("Some clever error message");
shellError.setStacktrace(stack);
Run Code Online (Sandbox Code Playgroud)
所以...为什么要打扰生成器呢?我喜欢这样的事实,即我的build()以及其他方面可以方便地验证所有字段是否设置得恰当等.
我会喜欢它,如果我可以... build()ShellError并添加Error类中的字段.
我做了什么工作.
有没有更好的方法,或者它有意义我做了什么?
- 编辑
我更新了Builder()以接受之前在Error类中的一些参数.我现在有
shellError = new ShellError.Builder(exception, "Some description").setFile(filePattern).setHost(host)
.setPath(path).setSource(file.isSource()).
setJobName(p.getJobName()).build();
Run Code Online (Sandbox Code Playgroud)
你说什么?更好?更差?
根据Effective Java 2ed Item 2
telescoping构造函数模式,其中您提供仅具有所需参数的构造函数,另一个具有单个可选参数,第三个具有两个可选参数,依此类推,最终在具有所有可选参数的构造函数中.
应用此模式的类的构造函数的示例借用于何时使用Builder模式?
代码集1a
Pizza(int size) { ... }
Pizza(int size, boolean cheese) { ... }
Pizza(int size, boolean cheese, boolean pepperoni) { ... }
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) { ... }
Run Code Online (Sandbox Code Playgroud)
size是必需参数.奶酪,意大利辣香肠和培根是可选参数.假设我想提供如下构造函数.
代码集1b
Pizza(int size) { ... }
Pizza(int size, boolean cheese) { ... }
Pizza(int size, boolean pepperoni) { ... }
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon, int price, int) { ... …Run Code Online (Sandbox Code Playgroud) public class Employee {
private String name;
private String address;
private int id;
public Employee() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Employee [name=" + name + ", address=" + address + ", id=" + id + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getId() …Run Code Online (Sandbox Code Playgroud) builder ×4
java ×4
android ×1
constructor ×1
inheritance ×1
java-8 ×1
oop ×1
parameters ×1
refactoring ×1