所谓建造者模式,就是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的设计模式。建造者模式在构建过程中隐藏了复杂的实现细节,可以大大降低代码耦合度。
建造者模式的实现方式
《水浒传》讲述了的故事,梁山泊是一个不断壮大的队伍
先写一个Troops:
Troops {
String ;
ArrayList<String> = ArrayList<>();
String ;
setLeader(String leader) {
.= leader;
}
setOthers(String... others) {
(String other:others){
..add(other);
}
}
setPurpose();
String toString() {
+
+ + +
+ .toString() +
+ + +
;
}
} |
这是梁山的Troops:
Liangshan Troops {
Liangshan(){}
setPurpose() {
= ;
}
} |
再写一个Builder:
Builder {
buildLeader(String leader);
buildOthers(String... others);
buildPurpose();
Troops create();
} |
这是好汉们的Builder:
LiangshanBuilder Builder {
Liangshan ;
buildLeader(String leader) {
.setLeader(leader);
}
buildOthers(String... others) {
.setOthers(others);
}
buildPurpose() {
.setPurpose();
}
Troops create() {
;
}
} |
接下来写一个Director:
Director {
Builder = ;
Director(Builder builder){
.= builder;
}
construct(String leader,String... others){
.buildLeader(leader);
.buildOthers(others);
.buildPurpose();
}
} |
我们只需要如下代码便可以实现梁山好汉的大聚义:
Builder builder = LiangshanBuilder(); Director director = Director(builder); director.construct(,,,); Log.(,builder.create().toString()); |
在实际开发过程中,Director层常常被省略,由一个链式调用的Builder来进行对象的组装。我们这次用梁山好汉的对立面——方腊来举例,这次这么改写上文的Builder:
MingjiaoBuilder{
Mingjiao ;
MingjiaoBuilder(){
= Mingjiao();
}
MingjiaoBuilder buildLeader(String leader) {
.setLeader(leader);
;
}
MingjiaoBuilder buildOthers(String... others) {
.setOthers(others);
;
}
MingjiaoBuilder buildPurpose() {
.setPurpose();
;
}
Mingjiao create() {
;
}
} |
当然,Troops是这样继承的:
Mingjiao Troops {
setPurpose() {
.= ;
}
} |
然后方腊作乱犯上的过程是这样的:
MingjiaoBuilder builder = MingjiaoBuilder() .buildLeader() .buildOthers(,,) .buildPurpose(); Log.(,builder.create().toString()); |
Android源码中的建造者模式
AlertDialog.Builder是Android源码中最常见的建造者模式,调用方式不再赘述。不过请注意这个建造者模式中并没有Director层的出现,因此这是一种简化的建造者模式。
Android开发中如何利用建造者模式
(1)建造者模式具备封装性良好的优点。在一个对象的初始化特别复杂、并且很多参数都有默认值时的优势非常明显。
(2)建造者模式还具备Builder独立、易于扩展的优点。可以在几个setter方法执行顺序不同时产生不同的结果。
需要注意的几个问题
(1)建造者模式会产生多余的Builder对象和Director对象,是典型的用运行效率换开发进度的设计模式


