作者的其他平台:
| CSDN:https://blog.csdn.net/qq_41153943
| 掘金:https://juejin.cn/user/651387938290686
| 知乎:https://www.zhihu.com/people/1024-paper-96
| GitHub:https://github.com/JiangXia-1024?tab=repositories
| 微信公众号:1024笔记
本文大概
5119
字
读完共需
12
分钟
组成部分:
ConcreteBuilder:具体建造者,实现各个部件的创建,并负责组装Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法。
Director:指导者,主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象。
栗子:
package com.jiangxia.BuilderPattern;/*** @Author: 江夏* @Date: 2021/10/28/22:06* @Description:车产品*/public class CarProduct {//车的轮子private String Wheel;//车的方向盘private String steeringWheel;//车的车盖private String Hood;//车的玻璃private String Windshield;public String getWheel() {return Wheel;}public void setWheel(String wheel) {Wheel = wheel;}public String getSteeringWheel() {return steeringWheel;}public void setSteeringWheel(String steeringWheel) {this.steeringWheel = steeringWheel;}public String getHood() {return Hood;}public void setHood(String hood) {Hood = hood;}public String getWindshield() {return Windshield;}public void setWindshield(String windshield) {Windshield = windshield;}}
抽象的产品建造流程
package com.jiangxia.BuilderPattern;/*** @Author: 江夏* @Date: 2021/10/28/21:56* @Description: 假设车子由以下几个部分组成 用建造者模式模拟汽车的生产* 抽象车建造者*/public interface AbstractCarBuild {//创建车的轮子void createWheel();//创建车的方向盘void createsteeringWheel();//创建车的车盖void createHood();//创建车的玻璃void createWindshield();//车子创建完成CarProduct create();}
汽车和卡车具体的建造者
package com.jiangxia.BuilderPattern;/*** @Author: 江夏* @Date: 2021/10/28/22:03* @Description: 具体汽车的建造者*/public class ConcreteCarBuild1 implements AbstractCarBuild {private CarProduct automobileCar = new CarProduct();@Overridepublic void createWheel() {automobileCar.setWheel("汽车轮子");}@Overridepublic void createsteeringWheel() {automobileCar.setSteeringWheel("汽车方向盘");}@Overridepublic void createHood() {automobileCar.setHood("汽车车盖");}@Overridepublic void createWindshield() {automobileCar.setWindshield("汽车挡风玻璃");}@Overridepublic CarProduct create() {return automobileCar;}}
package com.jiangxia.BuilderPattern;/*** @Author: 江夏* @Date: 2021/10/29/22:51* @Description:具体货车建造者*/public class ConcreteCarBuild2 implements AbstractCarBuild{private CarProduct truckCar = new CarProduct();@Overridepublic void createWheel() {truckCar.setWheel("货车轮胎");}@Overridepublic void createsteeringWheel() {truckCar.setSteeringWheel("货车方向盘");}@Overridepublic void createHood() {truckCar.setHood("货车车盖");}@Overridepublic void createWindshield() {truckCar.setWindshield("货车挡风玻璃");}@Overridepublic CarProduct create() {return truckCar;}}
package com.jiangxia.BuilderPattern;/*** @Author: 江夏* @Date: 2021/10/28/22:05* @Description:指挥者负责产品的创建流程*/public class CarDirector {private AbstractCarBuild abstractCarBuild;public CarProduct build(){abstractCarBuild.createHood();abstractCarBuild.createsteeringWheel();abstractCarBuild.createWheel();abstractCarBuild.createWindshield();return abstractCarBuild.create();}public CarDirector(AbstractCarBuild abstractCarBuild) {this.abstractCarBuild = abstractCarBuild;}public AbstractCarBuild getAbstractCarBuild() {return abstractCarBuild;}public void setAbstractCarBuild(AbstractCarBuild abstractCarBuild) {this.abstractCarBuild = abstractCarBuild;}}
package com.jiangxia.BuilderPattern;/*** @Author: 江夏* @Date: 2021/10/28/22:07* @Description:*/public class BuildPatternTest {public static void main(String[] args) {AbstractCarBuild abstractCarBuild = new ConcreteCarBuild1();CarDirector carDirector = new CarDirector(abstractCarBuild);CarProduct carProduct = carDirector.build();System.out.println("汽车信息:");System.out.println(carProduct.getHood());System.out.println(carProduct.getSteeringWheel());System.out.println(carProduct.getWheel());System.out.println(carProduct.getWindshield());System.out.println("========================");carDirector.setAbstractCarBuild(new ConcreteCarBuild2());CarProduct truckProduct = carDirector.build();System.out.println("货车信息:");System.out.println(truckProduct.getHood());System.out.println(truckProduct.getSteeringWheel());System.out.println(truckProduct.getWheel());System.out.println(truckProduct.getWindshield());}}
运行结果如下:

通过上述代码的演示,可以总结建造者模式具有以下特点:
优点:
1、使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、具体的建造者类之间是相互独立的,对系统的扩展非常有利,有利于系统的解耦。
3、由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
缺点:
2、如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
应用场景:
建造者模式主要适用于以下应用场景:
3、产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
建造者模式和工厂模式的区别
1、建造者模式更加注重方法的调用顺序,工厂模式注重创建对象。
2、创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的对象都一样
-END-
从零开始学设计模式(一):什么是设计模式 从零开始学设计模式(二):单例模式 从零开始学设计模式(三):原型模式(Prototype Pattern) 从零开始学设计模式(四):工厂模式(Factory Pattern) Spring注解(六):Bean的生命周期中自定义初始化和销毁方法的四种方式

点个 在看你最好看





