首页 > 代码库 > 建造者模式

建造者模式

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

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. 建造者模式的变形

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

参考:建造者模式的实践

建造者模式