建造者模式
建造者模式和工厂模式有点类似。所以建议复习一下工厂模式的文章 工厂模式小结
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. 建造者模式的变形
实际上创建一个模型,可能有多个参数。
参考:建造者模式的实践