建造者模式

建造者模式和工厂模式有点类似。所以建议复习一下工厂模式的文章 工厂模式小结

1. 适用场景

建造者模式,跟工厂模式一样,对客户端屏蔽了产品实现的细节,对外只呈现一个最终的产品。

与工厂模式不太一样的是:

1). 该产品相对于工厂模式的产品更为复杂,通常是由好几个模块组装而成;

2). 模块的生成顺序是稳定的;或者说,可以通过建造者模式来指定模块的生成顺序。比如组装一台PC,可以指定按顺序买显示器,机箱,主板,CPU,内存,SSD,键盘等等。

 

2. 结构分析

Builder,建造者,通常是个接口或抽象类。定义了一系列的模块生产方法,以及最终返回产品的方法。

ConcreteBuiler,具体的建造者。Builder的实现类,实现对各个模块的生产和最终返回的产品。通过实现不同的建造者,可以扩展不同的产品。

Director,指挥者,指挥建造者干活的类。在这里,可以指定建造者的生产顺序。

Product,最终生产出来的产品。不同的Builder应该会生产不同的Product.

写到这里,突然发现,Builder就像是建筑工人,而Director就像是工头。不同场景下的工人,刷墙的方式不一样,但刷墙的顺序是一样的。这时,工头就可以根据不同的场景,比如精装修和简装的房子,指挥不同的工人进行刷墙,而最终工人刷出来的墙都是【刷过的墙】,但当然不一样(精装和简装)。

 

3.来个例子

将之前工厂模式的例子稍微修改一下,生产一整套的运动服。

 1 package com.khlin;
 2 
 3 public class App {
 4 
 5     public static void main(String[] args) {
 6         Builder builder = new ManUtdBuilder();
 7         Director director = new Director(builder);
 8         director.construct();
 9         SportSuit sportSuit = builder.getProduct();
10         System.out.println(sportSuit.toString());
11     }
12 }
13 
14 class SportSuit {
15     String jersey;
16 
17     String sneakers;
18 
19     String socks;
20 
21     public void setJersey(String jersey) {
22         this.jersey = jersey;
23     }
24 
25     public void setSneakers(String sneakers) {
26         this.sneakers = sneakers;
27     }
28 
29     public void setSocks(String socks) {
30         this.socks = socks;
31     }
32 
33     @Override
34     public String toString() {
35         return "I m wearing " + jersey + " and " + sneakers + " and " + socks;
36     }
37 }
38 
39 interface Builder {
40 
41     void buildJersey();
42 
43     void buildSneakers();
44 
45     void buildSocks();
46 
47     SportSuit getProduct();
48 }
49 
50 class ManUtdBuilder implements Builder {
51 
52     // builder持有产品
53     private SportSuit sportSuit = new SportSuit();
54 
55     @Override
56     public void buildJersey() {
57         this.sportSuit.setJersey("ManUtd Jersey");
58     }
59 
60     @Override
61     public void buildSneakers() {
62         this.sportSuit.setSneakers("Adidas Sneakers");
63     }
64 
65     @Override
66     public void buildSocks() {
67         this.sportSuit.setSocks("Adidas Socks");
68         ;
69     }
70 
71     @Override
72     public SportSuit getProduct() {
73         return this.sportSuit;
74     }
75 }
76 
77 class Director {
78     Builder builder;
79     
80     public Director(Builder builder) {
81         this.builder = builder;
82     }
83     
84     public void construct() {
85         //指定建造的顺序
86         builder.buildJersey();
87         builder.buildSneakers();
88         builder.buildSocks();
89     }
90 }

 4. 建造者模式的变形

实际上创建一个模型,可能有多个参数。

参考:建造者模式的实践

posted @ 2016-10-30 08:59  kingsleylam  阅读(266)  评论(0编辑  收藏