什么是建造者模式

 

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

 

建造者模式的实现方式

 

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

先写一个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源码中的建造者模式

 

(1)AlertDialog.Builder

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

 

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

 

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

 

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

 

需要注意的几个问题

 

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