对象初始化 Builder 模式
这里要说的不是创建对象的那几种工厂模式,而是一种初始化对象通常会采用的模式。我个人很喜欢用,不过说实话,我在实际中似乎很少看到有人使用。
所谓的对象初始化,简单的说就是在创建对象之后,初始化对象的一些属性值,一般情况下,我们都是通过构造函数这个东西来完成这个过程的。但是,如果对象的属性很多,那就需要很多的构造函数,而且,要枚举这些属性的组合,那几乎是不可能的。(题外话,VB.NET 等语言有缺省参数这种特性,这时候还真是管用)。
看一个例子吧,假设我们有这样一个类: 如果有一个构造函数用于初始化类的这些所有的属性,那么构造一个 Person 实例的代码可能看起来象是这样的:
Person obj = new Person ("shwen", 37, null, null, 0, null, null);
一眼看去,谁能分得清楚哪个参数对应的是哪个?
因此,为了方便代码的阅读,往往我们不得不这样写: 这样清楚多了,但是需要额外的声明一堆临时的变量。最后出场的 Builder 模式,则将这样来写: 很简单啊,就是将所有的 setter 方法加上一个返回值, return this 就可以了,这样我们的初始化代码,就可以这样了
所谓的对象初始化,简单的说就是在创建对象之后,初始化对象的一些属性值,一般情况下,我们都是通过构造函数这个东西来完成这个过程的。但是,如果对象的属性很多,那就需要很多的构造函数,而且,要枚举这些属性的组合,那几乎是不可能的。(题外话,VB.NET 等语言有缺省参数这种特性,这时候还真是管用)。
看一个例子吧,假设我们有这样一个类: 如果有一个构造函数用于初始化类的这些所有的属性,那么构造一个 Person 实例的代码可能看起来象是这样的:
Person obj = new Person ("shwen", 37, null, null, 0, null, null);
一眼看去,谁能分得清楚哪个参数对应的是哪个?
因此,为了方便代码的阅读,往往我们不得不这样写: 这样清楚多了,但是需要额外的声明一堆临时的变量。最后出场的 Builder 模式,则将这样来写: 很简单啊,就是将所有的 setter 方法加上一个返回值, return this 就可以了,这样我们的初始化代码,就可以这样了
这种代码风格大家应该很熟悉吧,对,我们在使用 StringBuilder 时,往往就是这么用的罗。
再来看一个复杂点的例子,用 Builder 模式来初始化一个树结构
1 Class TreeNode {
2 string text;
3 List<TreeNode> childs;
4 }
5
6 Class TreeNodeBuilder {
7 TreeNode obj = new TreeNode();
8 List<TreeNodeBuilder> childs;
9
10 TreeNodeBuilder setText() {}
11
12 TreeNodeBuilder addChild(TreeNodeBuilder item) {
13 childs.add(item);
14 return this;
15 }
16
17 TreeNode objectValue(){
18 foreach (item in childs)
19 obj.childs.add(item.objectValue());
20 return obj;
21 }
22 }
23
24 TreeNode tree = New TreeNodeBuilder().setText("root")
25 .addChild( newTreeNodeBuild().setText("item1")
26 .addChild(newTreeNodeBuild().setText("item1-1"))
27 .addChild(newTreeNodeBuild().setText("item1-2"))
28 .addChild(newTreeNodeBuild().setText("item1-3"))
29 )
30 .addChild(newTreeNodeBuild().setText("item2")
31 .addChild(newTreeNodeBuild().setText("item2-1"))
32 .addChild(newTreeNodeBuild().setText("item2-2")
33 .addChild(newTreeNodeBuild().setText("item2-2-1"))
34 .addChild(newTreeNodeBuild().setText("item2-2-2"))
35 )
36 )
2 string text;
3 List<TreeNode> childs;
4 }
5
6 Class TreeNodeBuilder {
7 TreeNode obj = new TreeNode();
8 List<TreeNodeBuilder> childs;
9
10 TreeNodeBuilder setText() {}
11
12 TreeNodeBuilder addChild(TreeNodeBuilder item) {
13 childs.add(item);
14 return this;
15 }
16
17 TreeNode objectValue(){
18 foreach (item in childs)
19 obj.childs.add(item.objectValue());
20 return obj;
21 }
22 }
23
24 TreeNode tree = New TreeNodeBuilder().setText("root")
25 .addChild( newTreeNodeBuild().setText("item1")
26 .addChild(newTreeNodeBuild().setText("item1-1"))
27 .addChild(newTreeNodeBuild().setText("item1-2"))
28 .addChild(newTreeNodeBuild().setText("item1-3"))
29 )
30 .addChild(newTreeNodeBuild().setText("item2")
31 .addChild(newTreeNodeBuild().setText("item2-1"))
32 .addChild(newTreeNodeBuild().setText("item2-2")
33 .addChild(newTreeNodeBuild().setText("item2-2-1"))
34 .addChild(newTreeNodeBuild().setText("item2-2-2"))
35 )
36 )
37 .objectValue();
树的结构很明确的体现在代码的缩进结构中,看起来是不是舒服?