建造者模式
1 定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2通用代码
- Product :产品类。通常是实现了模板方法。
- Builder: 抽象创建者。规范产品的组建,一般由子类来具体实现。
- ConcreateBuilder: 具体创建者,并返回一组创建好的对象。
- Director: 负责安排已有模块顺序,并通知Builder开始创建。
public class Product {
public void doSomething(){
}
}
public abstract class Builder {
//设置产品的不同部分,以获得不同的产品
protected abstract void builderPart1();
protected abstract void builderPart2();
//建造产品
public abstract Product getProduct();
}
public class ConcreateBuilder extends Builder {
private Product product = new Product();
@Override
protected void builderPart1() {
}
@Override
protected void builderPart2() {
}
@Override
public Product getProduct() {
return product;
}
}
public class Director {
private Builder builder = new ConcreateBuilder();
public Product getProductA(){
builder.builderPart1();
builder.builderPart2();
return builder.getProduct();
}
}
3适用场景
- 相同方法,不同执行顺序产生不同事件结果。
- 多个零部件,都可以装配到一个对象中,但是产生的运行结果不相同。
- 产品类非常复杂,或者产品类调用顺序不同产生不同的结果。
- 当初始化一个对象非常复杂,如参数多,且参数都有默认值。
4 特点
在现实开发过程,Director这个角色经常会被省略。而直接使用一个Builder来进行对象的组装,这个Builder通常为链式调用,它的关键是每个set方法都返回自身,即return this,这样setter就可以链式调用。
new Builder().setA("A").setB("B").setC("C").create();
5 优点
- 良好的封装性,使用建造者模式使客户端不必知道产品内部具体的实现。
- 建造者独立,易于扩展。
6 缺点
会产生多于的Builder对象以及Director对象,消耗内存。
7 链式调用Builder模式
CustomerDialog.java
public class CustomerDialog {
private String title;
private String message;
private String button;
public void setTitle(String title){
this.title = title;
}
public void setMessage(String message){
this.message = message;
}
public void setButton(String button){
this.button = button;
}
@Override
public String toString() {
return "This dialog is [ title="+title+" , message="+message+" , button="+button+"]";
}
public String show(){
return this.toString();
}
}
DialogBuilder.java
public class DialogBuilder {
private CustomerDialog dialog;
public DialogBuilder(){
dialog = new CustomerDialog();
}
public DialogBuilder setTitle(String title){
dialog.setTitle(title);
return this;
}
public DialogBuilder setMessage(String message) {
dialog.setMessage(message);
return this;
}
public DialogBuilder setButton(String button) {
dialog.setButton(button);
return this;
}
public CustomerDialog create(){
return dialog;
}
}
DisplayDialog.java
public class DisplayDialog {
public static DialogBuilder with(){
return new DialogBuilder();
}
}
@Test
public void testMain1(){
CustomerDialog dialog =
DisplayDialog.with()
.setTitle("Dialog test")
.setMessage("Dialog content")
.setButton("Dialog button")
.create();
System.out.println(dialog.show());
}