什么是建造者模式

所谓建造者模式,就是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的设计模式。建造者模式在构建过程中隐藏了复杂的实现细节,可以大大降低代码耦合度。

建造者模式的实现方式

《水浒传》讲述了的故事,梁山泊是一个不断壮大的队伍

先写一个Troops:

public abstract class Troops {

protected String leader;
protected ArrayList<String> others = new ArrayList<>();
protected String purpose;

//领袖
public void setLeader(String leader) {
this.leader = leader;
}

//其他人
public void setOthers(String... others) {
for (String other:others){
this.others.add(other);
}
}

//宗旨
public abstract void setPurpose();


@Override
public String toString() {
return "Troops{" +
"leader='" + leader + '\'' +
", others=" + others.toString() +
", purpose='" + purpose + '\'' +
'}';
}
}

这是梁山的Troops:

public class Liangshan extends Troops {

protected Liangshan(){}

@Override
public void setPurpose() {
purpose = "替天行道";
}
}

再写一个Builder:

public abstract class Builder {

public abstract void buildLeader(String leader);

public abstract void buildOthers(String... others);

public abstract void buildPurpose();

public abstract Troops create();

}

这是好汉们的Builder:

public class LiangshanBuilder extends Builder {

private Liangshan liangshan;

@Override
public void buildLeader(String leader) {
liangshan.setLeader(leader);
}

@Override
public void buildOthers(String... others) {
liangshan.setOthers(others);
}

@Override
public void buildPurpose() {
liangshan.setPurpose();
}

@Override
public Troops create() {
return liangshan;
}
}

接下来写一个Director:

public class Director {

Builder mBuilder = null;

public Director(Builder builder){
this.mBuilder = builder;
}

public void construct(String leader,String... others){
mBuilder.buildLeader(leader);
mBuilder.buildOthers(others);
mBuilder.buildPurpose();
}

}

我们只需要如下代码便可以实现梁山好汉的大聚义:

Builderbuilder = new LiangshanBuilder();
Director director = new Director(builder);
director.construct("宋江","卢俊义","吴用","公孙胜");
Log.e("梁山",builder.create().toString());

在实际开发过程中,Director层常常被省略,由一个链式调用的Builder来进行对象的组装。我们这次用梁山好汉的对立面——方腊来举例,这次这么改写上文的Builder:

public class MingjiaoBuilder{
private Mingjiao mingjiao;

public MingjiaoBuilder(){
mingjiao = new Mingjiao();
}

public MingjiaoBuilder buildLeader(String leader) {
mingjiao.setLeader(leader);
return this;
}

public MingjiaoBuilder buildOthers(String... others) {
mingjiao.setOthers(others);
return this;
}

public MingjiaoBuilder buildPurpose() {
mingjiao.setPurpose();
return this;
}

public Mingjiao create() {
return mingjiao;
}
}

当然,Troops是这样继承的:

public class Mingjiao extends Troops {
@Override
public void setPurpose() {
this.purpose = "作乱犯上";
}
}

然后方腊作乱犯上的过程是这样的:

MingjiaoBuilder builder = new MingjiaoBuilder()
//虽是妄称天子位
.buildLeader("方腊")
//也须伪列宰臣班
.buildOthers("石宝","邓元觉","方杰")
.buildPurpose();
Log.e("明教",builder.create().toString());

Android源码中的建造者模式

(1)AlertDialog.Builder

AlertDialog.Builder是Android源码中最常见的建造者模式,调用方式不再赘述。不过请注意这个建造者模式中并没有Director层的出现,因此这是一种简化的建造者模式。

Android开发中如何利用建造者模式

(1)建造者模式具备封装性良好的优点。在一个对象的初始化特别复杂、并且很多参数都有默认值时的优势非常明显。

(2)建造者模式还具备Builder独立、易于扩展的优点。可以在几个setter方法执行顺序不同时产生不同的结果。

需要注意的几个问题

(1)建造者模式会产生多余的Builder对象和Director对象,是典型的用运行效率换开发进度的设计模式


本系列其他博客


【设计模式与Android】原型模式——复制中心走出来的克隆人


【设计模式与Android】工厂方法模式——化工女神的工厂


【设计模式与Android】抽象工厂模式——嵌合体克隆工厂


【设计模式与Android】策略模式——锦囊里的上策中策下策


【设计模式与Android】状态模式——一个人的两幅面孔