再读斋

Android设计模式之(二)Builder模式

介绍

Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,更精细地控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

使用场景

  1. 相同的方法,不同的执行顺序,产生不同的事件结果时;
  2. 多个部件或零件都可以装配到一个对象中,但是产生的运行结果又不相同时;
  3. 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常适合;
  4. 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值的情况下;

UML类图

UML类图角色介绍:

  • Product产品类-产品的抽象类;
  • Builder-抽象Builder类,规范产品的组建,一般由子类实现具体的组件过程;
  • ConcreteBuilder-具体的Builder类,组装对象;

Builder模式UML

简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.lgq.pattern.builder;
/**
* Computer抽象类 即 Product角色
* @author liuguoquan
*
*/
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOS;
public Computer() {
}
//设置主板
public void setBoard(String mBoard) {
this.mBoard = mBoard;
}
//设置显示器
public void setDisplay(String mDisplay) {
this.mDisplay = mDisplay;
}
//设置操作系统
public abstract void setOs();
@Override
public String toString() {
return "Computer [mBoard=" + mBoard + ", mDisplay=" + mDisplay + ", mOS=" + mOS + "]";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.lgq.pattern.builder;
/**
* 具体的Computer类
* @author liuguoquan
*
*/
public class MacBookPro extends Computer{
public MacBookPro() {
// TODO Auto-generated constructor stub
}
@Override
public void setOs() {
// TODO Auto-generated method stub
mOS = "Mac OS X 10.11";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.lgq.pattern.builder;
/**
* 抽象Builder
* @author liuguoquan
*
*/
public abstract class Builder {
public abstract Builder setBoard(String board);
public abstract Builder setDisplay(String display);
public abstract Builder setOs();
public abstract Computer create();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.lgq.pattern.builder;
/**
* Builder具体实现类
* @author liuguoquan
*
*/
public class MacBookBuilder extends Builder {
private Computer mComputer = new MacBookPro();
@Override
public Builder setBoard(String board) {
// TODO Auto-generated method stub
mComputer.setBoard(board);
return this;
}
@Override
public Builder setDisplay(String display) {
// TODO Auto-generated method stub
mComputer.setDisplay(display);
return this;
}
@Override
public Builder setOs() {
// TODO Auto-generated method stub
mComputer.setOs();
return this;
}
@Override
public Computer create() {
// TODO Auto-generated method stub
return mComputer;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer computer = new MacBookBuilder().setBoard("APPLE").setDisplay("Retina").setOs().create();
System.out.println(computer.toString());
}
}
结果打印:
Computer [mBoard=APPLE, mDisplay=Retina, mOS=Mac OS X 10.11]

上述示例中,通过具体的MacBookBuilder来构建MacBookPro对象,Builder将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的对象。

Android中应用

  • AlertDialog

总结

优点

  1. 良好的封装性,使用建造者模式可以使得客户端不必知道产品内部组成的细节。
  2. 建造者独立,容易扩展

缺点

会产生多余的Builder对象,消耗内存。

刘涤生 wechat