建造者(Builder)模式

参考资料:http://www.cnblogs.com/zhenyulu/articles/37378.html

 Builder模式的结构:

 

建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。

具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:

  • 实现Builder角色提供的接口,一步一步完成创建产品实例的过程。
  • 在建造过程完成后,提供产品的实例。

指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。

产品(Product)角色:产品便是建造中的复杂对象。

指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。

参考自:http://archive.cnblogs.com/a/2257625/

一 意图

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

二 适用性

在以下情况使用Build模式:

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

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

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

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

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

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

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

  1 package zzuli.acmen.builder;
2
3 /**
4 * 这个事Builder 模式 也就是建造者模式
5 * @author Administrator
6 *
7 */
8
9 //建造了主要构建一个大组件的零部件
10 //比如造房子,这个类就相当于一个泥水匠他知道如何建墙,窗户,和门但是不知道这个房子是什么样!他会构造房子的组件
11 public interface Builder {
12
13 public void buildQiang();
14 public void buildMen();
15 public void buildChuang();
16
17 //房子的组建
18 public Home BuildHome();
19
20 }
21
22 class henanBuilder implements Builder {
23
24 public void buildChuang() {
25 System.out.println("我建的是河南风格的窗");
26
27 }
28
29 public void buildMen() {
30 System.out.println("我建造的是河南风格的门");
31
32 }
33
34 public void buildQiang() {
35
36 System.out.println("我建造的是河南风格的墙");
37
38 }
39
40 public Home BuildHome() {
41 Home home = new Home();
42 return home;
43 }
44
45
46 }
47
48 class hebeiBuilder implements Builder {
49
50 public void buildChuang() {
51 System.out.println("我建的是河北风格的窗");
52
53 }
54
55 public void buildMen() {
56 System.out.println("我建造的是河北风格的门");
57
58 }
59
60 public void buildQiang() {
61
62 System.out.println("我建造的是河北风格的墙");
63
64 }
65
66 public Home BuildHome() {
67 Home home = new Home();
68 return home;
69 }
70
71
72 }
73
74 //最后客户要的房子
75
76 class Home{
77
78 public Home(){
79 System.out.println("我根据builder构造好的组件,我合成一个房子给用户");
80 }
81
82 }
83
84 //我是设计师,我知道如何去构造房子,知道房子建造的顺序,但是我不会砌墙
85
86 interface Director{
87 public void setBuilder(Builder build);
88
89 public void setHome();
90 }
91
92 //A设计师我喜欢先造墙再造门再造窗户
93 class ADirector implements Director{
94
95 Builder builder ;
96
97 public void setBuilder(Builder build) {
98
99 this.builder = build;
100
101 }
102
103 //具体的构造方法
104
105 public void setHome() {
106
107 builder.buildQiang();
108 builder.buildMen();
109 builder.buildChuang();
110
111 }
112
113 }
114
115 //B设计师喜欢先造墙再造窗再造门
116
117 class BDirector implements Director{
118
119 private Builder builder;
120
121 public void setBuilder(Builder build) {
122
123 this.builder = build;
124
125 }
126
127 public void setHome() {
128
129 builder.buildQiang();
130 builder.buildChuang();
131 builder.buildMen();
132
133 }
134
135 }
 1 package zzuli.acmen.builder;
2
3 /**
4 * 我的设计师主要是动脑子我知道顺序,但是不知道具体过程,泥水匠我知道怎么建但是不知道建成什么样!
5 * 扩展, 我可以把Builder做成一个抽象工厂,我会建造各种各样的组件!各个组建的建造就是用工厂模式来做,我一个工厂可以建造一类相似的
6 * 组件,最后我产生的过程呢就交给我的Builder 来做了! xixi
7 * @author Administrator
8 *
9 */
10
11 //Client 我是客户,我找一下设计师和泥水匠 我就有房子了@_@
12 public class Client{
13
14 public static void main(String[] args){
15 System.out.println("我建的第一个房子");
16 System.out.println("我先找一下设计师和泥瓦匠");
17 Builder builder = new hebeiBuilder();
18 Director dir = new ADirector();
19 System.out.println("我通知设计师去造房子吧!");
20 dir.setBuilder(builder);
21 dir.setHome();
22
23 Home home = builder.BuildHome();
24
25 System.out.println("我建造第二个房子");
26 Builder bu = new henanBuilder();
27 Director dir2 = new BDirector();
28 System.out.println("通知设计师去造房子吧!");
29 dir2.setBuilder(bu);
30 dir2.setHome();
31 Home dome2 = builder.BuildHome();
32
33 }
34
35 }



原文地址:https://www.cnblogs.com/Acmen/p/2365852.html