建造者模式(Builder)----设计模式
怎样得到每一辆车?
自从上次高工程师,不对,高高工程师为汽车制造计划又提供了原型设计模式以后,就不但可以使用工厂模式使汽车工厂能够造出不同类型的汽车,而且还可以根据用户的需要生产出很多相同的汽车。汽车工厂得到了迅猛发展…
但是在汽车生产的过程中,汽车老板并不想干预汽车生产的过程,他只想要车(Product)。于是他又叫来了高高工程师,高高工程师想了一会,告诉他,你可以聘用一个包工队(Director), 然后再设计一个你的所有汽车制造的大概流程(Builder),你只负责给包工队提供车辆的具体信息(ConcreteBuilder必须符合Builder),由包工队具体给你生产具体的车辆,车辆的生产细节和生产过程你不必管。
老板决定让高高工程师先弄一个试点测试测试,于是高高工程师马不停蹄地开始了…
开始结构化地制作每辆汽车
图解高高工程师的具体思想
制造汽车的分工
老板所要的车辆------> Product
负责制造汽车的包工头------> Director
所有车辆的大概制作流程------>Builder
每种车辆制作的具体流程------>ConcreteBuilder
高高工程师实施的流程
老板所要的车辆------> Product类
即Car类型对象
package com.design_patterns.builder.instance;
/**
* 等待生产的产品角色
* 具有方向盘、轮胎、发动机等属性以及setter和getter方法
*/
public class Car {
private String steeringWheel;
private String wheel;
private String engine;
public String getSteeringWheel() {
return steeringWheel;
}
public void setSteeringWheel(String steeringWheel) {
this.steeringWheel = steeringWheel;
}
public String getWheel() {
return wheel;
}
public void setWheel(String wheel) {
this.wheel = wheel;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
@Override
public String toString() {
return "Car{" +
"steeringWheel='" + steeringWheel + '\'' +
", wheel='" + wheel + '\'' +
", engine='" + engine + '\'' +
'}';
}
}
负责制造汽车的包工头------> Director
即CarDirector
package com.design_patterns.builder.instance;
/**
* 定义包工头类,即Director指挥者,根据具体传入的制作流程
* 进行汽车生产并返回
*/
public class CarDirector {
private CarBuilder carBuilder = null;
public CarDirector(CarBuilder carBuilder) {
this.carBuilder = carBuilder;
}
public CarBuilder getCarBuilder() {
return carBuilder;
}
public void setCarBuilder(CarBuilder carBuilder) {
this.carBuilder = carBuilder;
}
/**
* 指挥者指挥建造车子的具体流程,最后返回一个车子实例
* @return
*/
public Car constructCar(){
this.carBuilder.buildSteeringWheel();
this.carBuilder.buildWheel();
this.carBuilder.buildEngine();
return this.carBuilder.buildCar();
}
}
所有车辆的大概制作流程------>Builder
即CarBuilder类
package com.design_patterns.builder.instance;
/**
* 定义抽象建造者角色,抽象汽车的制作过程
*/
public abstract class CarBuilder {
protected Car car = new Car();
public abstract void buildSteeringWheel();
public abstract void buildWheel();
public abstract void buildEngine();
public Car buildCar(){
return car;
}
}
每种车辆制作的具体流程------>ConcreteBuilder
即BenzCarBuilder、BmwCarBuild类
package com.design_patterns.builder.instance;
/**
* 定义奔驰车的详细制作流程
*/
public class BenzCarBuild extends CarBuilder {
@Override
public void buildSteeringWheel() {
car.setSteeringWheel("奔驰车方向盘制造成功!");
}
@Override
public void buildWheel() {
car.setWheel("奔驰车轮胎制造成功!");
}
@Override
public void buildEngine() {
car.setEngine("奔驰车发动机制造成功!");
}
}
package com.design_patterns.builder.instance;
/**
* 定义宝马车的具体制作流程
*/
public class BmwCarBuild extends CarBuilder {
@Override
public void buildSteeringWheel() {
car.setSteeringWheel("宝马车方向盘制造成功!");
}
@Override
public void buildWheel() {
car.setWheel("宝马车轮胎制造成功!");
}
@Override
public void buildEngine() {
car.setEngine("宝马车发动机制造成功!");
}
}
最后是----->高高工程师的测试
package com.design_patterns.builder.instance;
/**
* 定义老板测试类,根据不同的车型生产信息返回不同的车型信息。
*/
public class Client {
public static void main(String[] args) {
BenzCarBuild benzCarBuild = new BenzCarBuild(); //实例化奔驰车生产流程
BmwCarBuild bmwCarBuild = new BmwCarBuild(); //实例化宝马车生产流程
CarDirector carDirector = new CarDirector(benzCarBuild); //实例化汽车生产包工头,传递的是奔驰车生产流程实例
Car car = carDirector.constructCar(); //生产奔驰车
carDirector.setCarBuilder(bmwCarBuild); //将包工头的生产信息改变为宝马车
Car car1 = carDirector.constructCar(); //生产宝马车
System.out.println("奔驰车生产成功---->" + car); //输出奔驰车信息
System.out.println("宝马车生产成功---->" + car1); //输出宝马车信息
}
}
测试结果
奔驰车生产成功---->Car{steeringWheel='奔驰车方向盘制造成功!', wheel='奔驰车轮胎制造成功!', engine='奔驰车发动机制造成功!'}
宝马车生产成功---->Car{steeringWheel='宝马车方向盘制造成功!', wheel='宝马车轮胎制造成功!', engine='宝马车发动机制造成功!'}
总结(寻找灵魂的人)
至此测试结束,嘻嘻,其实这个建造者模式有点难理解,其实建造者模式的本质就是将产品本身与产品的创建过程进行解耦分开,实现相同的创建过程可以创建不同的产品对象、根据蓝图创建一个整体的新产品。好啦,就写到这吧,如果觉得这篇文章写的不错的话麻烦点个赞,祝学业有成!!!
高高工程师再次帮助了工厂的结构转型,得到了厂长的称赞与表扬,只见他默默地整理好行装,背着书包向着夕阳走去…