建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
基本思想
某类产品的构建由很多复杂组件组成;
这些组件中的某些细节不同,构建出的产品表象会略有不同;
通过一个指挥者按照产品的创建步骤来一步步执行产品的创建;
当需要创建不同的产品时,只需要派生一个具体的建造者,重写相应的组件构建方法即可。
代码结构
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
|
class Builder( object ): """基类""" def Part1( self ): # 不同类型的产品,该步骤的细节可能不同 raise NotImplementedError() def Part2( self ): # 不同类型的产品,该步骤的细节可能不同 raise NotImplementedError() class Builder1(Builder): """派生类,生产builder1类型的产品""" def Part1( self ): print 'builder1 Part1' def Part2( self ): print 'builder1 Part2' class Builder2(Builder): """派生类,生产builder2类型的产品""" def Part1( self ): print 'builder2 Part1' def Part2( self ): print 'builder2 Part2' class Director( object ): """指挥者,负责组织产品的构建过程""" def Build( self , builder): builder.Part1() builder.Part2() def client(): director = Director() director.Build(Builder1()) director.Build(Builder2()) |
这里有一个疑问,指挥者这个角色有什么用呢。感觉除了增加client的调用负担外,似乎没什么用处。为什么不把产品构建过程放在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
|
class Builder( object ): """基类""" def Part1( self ): raise NotImplementedError() def Part2( self ): raise NotImplementedError() def Build( self ): self .Part1() self .Part2() class Builder1(Builder): def Part1( self ): print 'builder1 Part1' def Part2( self ): print 'builder1 Part2' class Builder2(Builder): def Part1( self ): print 'builder2 Part1' def Part2( self ): print 'builder2 Part2' def client(): Builder1().Build() Builder2().Build() |
没错,上面就是典型的模板方法模式的实现套路,回顾一下模板方法模式的定义: > 模板方法模式:定义一个工作流或算法的基本骨架,而将一些特定步骤的实现延迟到子类中。
模板方法模式更多的关注于算法流程,而建造者模式更多的关注于复杂对象的创建,模板模式应用场景比建造者模式更多一些,写起来也更自然一些。
类图
实例
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
|
#encoding=utf-8 # #by panda #建造者模式 def printInfo(info): print unicode (info, 'utf-8' ).encode( 'gbk' ) #建造者基类 class PersonBuilder(): def BuildHead( self ): pass def BuildBody( self ): pass def BuildArm( self ): pass def BuildLeg( self ): pass #胖子 class PersonFatBuilder(PersonBuilder): type = '胖子' def BuildHead( self ): printInfo( "构建%s的头" % self . type ) def BuildBody( self ): printInfo( "构建%s的身体" % self . type ) def BuildArm( self ): printInfo( "构建%s的手" % self . type ) def BuildLeg( self ): printInfo( "构建%s的脚" % self . type ) #瘦子 class PersonThinBuilder(PersonBuilder): type = '瘦子' def BuildHead( self ): printInfo( "构建%s的头" % self . type ) def BuildBody( self ): printInfo( "构建%s的身体" % self . type ) def BuildArm( self ): printInfo( "构建%s的手" % self . type ) def BuildLeg( self ): printInfo( "构建%s的脚" % self . type ) #指挥者 class PersonDirector(): pb = None ; def __init__( self , pb): self .pb = pb def CreatePereson( self ): self .pb.BuildHead() self .pb.BuildBody() self .pb.BuildArm() self .pb.BuildLeg() def clientUI(): pb = PersonThinBuilder() pd = PersonDirector(pb) pd.CreatePereson() pb = PersonFatBuilder() pd = PersonDirector(pb) pd.CreatePereson() return if __name__ = = '__main__' : clientUI(); |