首页 > 代码库 > 建造者模式
建造者模式
建造者模式和工厂模式有点类似。所以建议复习一下工厂模式的文章 工厂模式小结
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 @Override34 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 @Override56 public void buildJersey() {57 this.sportSuit.setJersey("ManUtd Jersey");58 }59 60 @Override61 public void buildSneakers() {62 this.sportSuit.setSneakers("Adidas Sneakers");63 }64 65 @Override66 public void buildSocks() {67 this.sportSuit.setSocks("Adidas Socks");68 ;69 }70 71 @Override72 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. 建造者模式的变形
实际上创建一个模型,可能有多个参数。
参考:建造者模式的实践
建造者模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。