定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。即组装的复杂对象没有变化,里面的拆分对象可以自定义替换。
一、需求:需要创建一个手机类实例,手机类包含了cpu、cell(电池)、pcb(电路板)三个全局变量。
结构:
建造者抽象类
建造者实现类
指挥类
产品类
package com.bycotrun.builder; //电池 public class Cell { public Cell() { System.out.println("电池构造方法"); } }
package com.bycotrun.builder; public class Cpu { public Cpu() { System.out.println("cpu构造方法"); } }
package com.bycotrun.builder; //电路板 public class Pcb { public Pcb() { System.out.println("电路板构造方法"); } }
package com.bycotrun.builder; //建筑者抽象类 public abstract class Builder { protected Phone2 phone = new Phone2(); public abstract void setCpu(); public abstract void setCell(); public abstract void setPcb(); public Phone2 getPhone() { return phone; }; }
package com.bycotrun.builder; //苹果手机建造者实现类 public class AppBuilder extends Builder { @Override public void setCpu() { super.phone.setCpu(new Cpu()); } @Override public void setCell() { super.phone.setCell(new Cell()); } @Override public void setPcb() { super.phone.setPcb(new Pcb()); } }
package com.bycotrun.builder; //指挥者类 public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } public Phone2 getPhone() { builder.setCell(); builder.setCpu(); builder.setPcb(); return builder.getPhone(); } public static void main(String[] args) { Director director = new Director(new AppBuilder()); Phone2 phone = director.getPhone(); System.out.println(phone); } }
二、当创建对象有很多入参时,可以使用链式编程,提高代码可读性高
package com.bycotrun.builder; //电池 public class Cell { public Cell() { System.out.println("电池构造方法"); } }
package com.bycotrun.builder; public class Cpu { public Cpu() { System.out.println("cpu构造方法"); } }
package com.bycotrun.builder; //电路板 public class Pcb { public Pcb() { System.out.println("电路板构造方法"); } }
package com.bycotrun.builder; //电话 public class Phone { private Cell cell;// 电池 private Cpu cpu;// cup private Pcb pcb;// 电路板 private Phone(Builder builder) {// 构造函数 System.out.println("手机构造方法"); this.cell = builder.cell; this.cpu = builder.cpu; this.pcb = builder.pcb; } public static class Builder {// 静态内部类 private Cell cell; private Cpu cpu; private Pcb pcb; public Builder cell(Cell cell) { this.cell = cell; return this; } public Builder cpu(Cpu cpu) { this.cpu = cpu; return this; } public Builder pcb(Pcb pcb) { this.pcb = pcb; return this; } // 构建Phone对象 public Phone build() { return new Phone(this); } } public static void main(String[] args) { //创建对象 Phone phone = new Phone.Builder() .cell(new Cell()) .cpu(new Cpu()) .pcb(new Pcb()) .build(); } }