构建者模式(Builder)
定义
将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
使用场景
主要角色
- 产品 Product
- 建造者接口 Builder
- 具体的建造者 Concrete Builder
- 指挥者 Director:组织构建过程
示例代码
@Data
public class Computer {private String cpu;//必须private String ram;//必须private int usbCount;//可选private String keyboard;//可选private String display;//可选public Computer(String cpu, String ram) {this.cpu = cpu;this.ram = ram;}}
public abstract class ComputerBuilder {public abstract void setUsbCount();public abstract void setKeyboard();public abstract void setDisplay();public abstract Computer build();
}
public class LenovoComputerBuilder extends ComputerBuilder {private Computer computer;public LenovoComputerBuilder(String cpu, String ram) {computer=new Computer(cpu,ram);}@Overridepublic void setUsbCount() {computer.setUsbCount(4);}@Overridepublic void setKeyboard() {computer.setKeyboard("联想键盘");}@Overridepublic void setDisplay() {computer.setDisplay("联想显示器");}@Overridepublic Computer build() {return computer;}
}
public class MacComputerBuilder extends ComputerBuilder {private Computer computer;public MacComputerBuilder(String cpu, String ram) {computer = new Computer(cpu, ram);}@Overridepublic void setUsbCount() {computer.setUsbCount(2);}@Overridepublic void setKeyboard() {computer.setKeyboard("苹果键盘");}@Overridepublic void setDisplay() {computer.setDisplay("苹果显示器");}@Overridepublic Computer build() {return computer;}
}
public class ComputerDirector {public void makeComputer(ComputerBuilder builder){builder.setUsbCount();builder.setDisplay();builder.setKeyboard();}
}
public class Client {public static void main(String[] args) {ComputerDirector director = new ComputerDirector();ComputerBuilder builder = new MacComputerBuilder("I5处理器", "三星125");director.makeComputer(builder);Computer macComputer = builder.build();System.out.println("mac computer:" + macComputer.toString());ComputerBuilder lenovoBuilder = new LenovoComputerBuilder("I7处理器", "海力士222");director.makeComputer(lenovoBuilder);Computer lenovoComputer = lenovoBuilder.build();System.out.println("lenovo computer:" + lenovoComputer.toString());}
}
mac computer:Computer(cpu=I5处理器, ram=三星125, usbCount=2, keyboard=苹果键盘, display=苹果显示器)
lenovo computer:Computer(cpu=I7处理器, ram=海力士222, usbCount=4, keyboard=联想键盘, display=联想显示器)