三颗纽扣

世界上最宽广的是海洋,比海洋更宽广的是天空,比天空更宽广的是人的胸怀

导航

对象初始化 Builder 模式

这里要说的不是创建对象的那几种工厂模式,而是一种初始化对象通常会采用的模式。我个人很喜欢用,不过说实话,我在实际中似乎很少看到有人使用。

所谓的对象初始化,简单的说就是在创建对象之后,初始化对象的一些属性值,一般情况下,我们都是通过构造函数这个东西来完成这个过程的。但是,如果对象的属性很多,那就需要很多的构造函数,而且,要枚举这些属性的组合,那几乎是不可能的。(题外话,VB.NET 等语言有缺省参数这种特性,这时候还真是管用)。

看一个例子吧,假设我们有这样一个类:
  1. Class Person {
  2.     string name;
  3.     int age;
  4.     string address;
  5.     string office_address;
  6.     int postcode;
  7.     Person mother;
  8.     Person father = null;
  9.     ...
  10. }
如果有一个构造函数用于初始化类的这些所有的属性,那么构造一个 Person 实例的代码可能看起来象是这样的:

Person obj = new Person ("shwen", 37, null, null, 0, null, null);

一眼看去,谁能分得清楚哪个参数对应的是哪个?

因此,为了方便代码的阅读,往往我们不得不这样写:
  1.     string name = "shwen";
  2.     int age = 37;
  3.     string address = null;
  4.     string office_address = null;
  5.     int postcode = 0;
  6.     Person mother = null;
  7.     Person father = null;
  8.     
  9.     Person obj = new Person(name, age, address, office_address, postcode, mother, father);
这样清楚多了,但是需要额外的声明一堆临时的变量。最后出场的 Builder 模式,则将这样来写:
  1. Class PersonBuilder {
  2.     Person obj = new Person();
  3.     
  4.     public PersonBuilder setName(string value) {
  5.         obj.setName(value);
  6.         return this;
  7.     }
  8.     ....
  9. }
很简单啊,就是将所有的 setter 方法加上一个返回值, return this 就可以了,这样我们的初始化代码,就可以这样了
  1. Person obj = new PersonBuilder()
  2.     .setName("shwen")
  3.     .setAge(37)
  4.     .setAddress(null)
  5.     ....
  6.     .objectValue();

这种代码风格大家应该很熟悉吧,对,我们在使用 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     )

37     .objectValue(); 

 

树的结构很明确的体现在代码的缩进结构中,看起来是不是舒服? 

posted on 2009-11-09 15:33  三颗纽扣  阅读(598)  评论(0编辑  收藏  举报