Android设计模式 建造者模式builder

今天小编来说一下Android中的一种设计模式–建造者模式Builder
绪论:

那么对于Android初级来说,Builder设计模式可能在我们开发中用过的很少,但是我们可能见过,我们经常用的AlterDialog.Builder就是一种建造者模式。那么到底什么是建造者模式呢?下面我们来看看它的标准定义:
定义:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,同时可以分步的构造每一部分。
看起来比较抽象,也不知道具体是什么意思?下面我举一个例子,通过代码来看看什么是建造者模式
举例:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com;
/**
* Created by Hankkin on 15/10/21.
*/
public class ImageBean {
private int id; //图片id
private String path; //图片路径
private long size; //图片大小
private String type; //图片类型
public ImageBean() {
}
public ImageBean(int id, String path, long size, String type) {
this.id = id;
this.path = path;
this.size = size;
this.type = type;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}

我们定义了一个ImageBean实体,里面包含id、path、size、type属性,其中还包含空的构造方法和一个包含参数的构造。这样我们在声明这个实体的时候可以给这个实体赋值。

ImageBean ib = new ImageBean(1,”xxxx”,”54321”,”jpg”);

实体的参数个数少点还好,我们能记住构造的参数,如果这个实体有N个参数呢?我们怎样知道参数的顺序呢?代码的可读性并不高,如果不是你自己写的,别人根本看不懂,即便是自己写的,时间长了的话恐怕我们也都忘了。那么Builder模式就可以解决这种情况。我们可以给

ImageBean建立一个Builder:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com;
/**
* Created by Hankkin on 15/10/21.
*/
public class ImageBean {
private int id; //图片id
private String path; //图片路径
private long size; //图片大小
private String type; //图片类型
public ImageBean() {
}
public ImageBean(Builder builder) {
this.id = builder.id;
this.path = builder.path;
this.size = builder.size;
this.type = builder.type;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public static class Builder{
private int id;
private String path;
private long size;
private String type;
public Builder id(int id){
this.id = id;
return this;
}
public Builder path(String path){
this.path = path;
return this;
}
public Builder size(long size){
this.size = size;
return this;
}
public Builder type(String type){
this.type = type;
return this;
}
public ImageBean build(){
return new ImageBean(this);
}
}
}
ImageBean.Builder builder = new ImageBean.Builder();
ImageBean ib = builder.id(11).path("xxx").size(1111).type("jpg").build();

可以看到ImageBean的构造参数改成了这个builder,然后定义了一个和ImageBean一样的Builder,返回值都是builder对象。这就是定义里面说的构造和表示分离,构造是ImageBean中来构造,而显示则在Builder中显示。也就是分布构造每一部分。

以上只是builder设计模式的一种用法
总结:

在以下情况使用Build模式:

  • 1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

  • 2 当构造过程必须允许被构造的对象有不同的表示时。

  • 3 Builder模式要解决的也正是这样的问题:

  当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),

  我们要复杂对象的创建过程和这个对象的表示(展示)分离开来,

  这样做的好处就是通过一步步的进行复杂对象的构建,

  由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。