这里的具体的建造者ConcreteBuilder可以多个
这里我们以建造汽车为例:
假设汽车需要:方向盘、汽车壳、还有四个轮子 ---------这三样才能跑起来
如果你因为粗心漏了其中的某个建造过程(例如:忘了装方向盘),那么汽车就跑不起来。
有什么方法可以避免粗心,漏了其中的某个过程?
代码如下:
1.Builder类 为 AbstractBuilderCar
** * * 抽象建造汽车父类 * @author lizhibiao * @date 2019/1/16 21:34 */public abstract class AbstractBuilderCar{ /** * 抽象的----建造方向盘方法 */ public abstract void buildSteeringWheel(); /** * 抽象的----安上汽车壳 */ public abstract void buildShell(); /** * 抽象的----安上轮子 */ public abstract void buildWheel(); /** * 获取汽车 * @return 返回汽车类 */ public abstract Car getCar();}
这里最核心的地方是:
首先 AbstractBuilderCar是一个抽象类
然后 它的方法都是抽象方法,这么做的必要是为了让子类继承时,都必须实现抽象方法,避免粗心,漏掉其中的某个建造过程。(子类是不是抽象类,那么继承抽象父类时,必须实现所有的抽象方法,否则报错)
最后,有一个获取汽车类
2.两个 ConcreteBuilder类(小黄车和小蓝车),继承Builder
/** * 小黄车 * @author lizhibiao * @date 2019/1/16 21:43 */public class YellowCar extends AbstractBuilderCar{ private Car car = new Car(); @Override public void buildSteeringWheel() { car.add("1.装上方向盘"); } @Override public void buildShell() { car.add("2.装上黄色的车壳"); } @Override public void buildWheel() { car.add("3.最后安上四个轮子"); } @Override public Car getCar() { return car; }}
/** * 小蓝车 * @author lizhibiao * @date 2019/1/16 21:46 */public class BlueCar extends AbstractBuilderCar{ private Car car = new Car(); @Override public void buildSteeringWheel() { car.add("1.装上方向盘"); } @Override public void buildShell() { car.add("2.装上蓝色的车壳"); } @Override public void buildWheel() { car.add("3.最后安上四个轮子"); } @Override public Car getCar() { return car; }}
3.Car类
/** * @author lizhibiao * @date 2019/1/16 21:52 */public class Car{ /** * 建造步骤list */ private List<String> list = new ArrayList<>(); /** * 添加汽车建造步骤 */ public void add(String steps) { list.add(steps); } /** * 打印汽车 */ public void printCar() { for (String stepInfo : list) { System.out.println(stepInfo); } }}
4.指挥者类
/** * 指挥者类 * @author lizhibiao * @date 2019/1/16 21:49 */public class Director{ /** * 建造过程 * @param builderCar 传入具体建造者,例如:小黄、小蓝 */ public void build(AbstractBuilderCar builderCar) { builderCar.buildSteeringWheel(); builderCar.buildShell(); builderCar.buildWheel(); }}
5.测试类
/** * 测试类 * @author lizhibiao * @date 2019/1/17 15:05 */public class Main{ public static void main(String[] args) { //指挥者 Director director = new Director(); //new一个小黄车,多态,返回的是抽象父类 AbstractBuilderCar buildYellowCar = new YellowCar(); //按顺序建造汽车 director.build(buildYellowCar); //获取小黄车 Car yellowCar = buildYellowCar.getCar(); //打印建造过程 yellowCar.printCar(); System.out.println("======================="); System.out.println("======================="); //建造小蓝车 AbstractBuilderCar buildBlueCar = new BlueCar(); director.build(buildBlueCar); Car blueCar = buildBlueCar.getCar(); blueCar.printCar(); }}
输出结果:
1.装上方向盘
2.装上黄色的车壳
3.最后安上四个轮子
=======================
=======================
1.装上方向盘
2.装上蓝色的车壳
3.最后安上四个轮子