Builder(生成器)
意图:将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示。
在以下情况使用Builder模式
- 当创建复杂的对象应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
结构图
builder模式更注重与一个复杂对象的创建,像组装一样,一层一层,一个模块一个模块的装配,是一个由简单对象到复杂对象的过程。
假设现在去淘宝请人组装机子,一台好的(goodcomputer),一台差的(badcomputer)
Direct 导向器就像淘宝商家,你给他套餐(good or bad Builder)订单,剩下的准备材料和组装过程你就没必要知道了,只要下单就行,然后根据订单收货。
Computer(省略get set)
public class Computer {
private String cpu;
private String gpu;
private String memory;
private String keyboard;
private String mouse;
builder 接口
public class ComputerDirector {
public void create(ComputerBuilder builder){
builder.builder();
}
}
bad套餐
public class BadBuilder extends ComputerBuilder {
private Computer computer ;
@Override
void builder() {
computer = new Computer();
computer.setCpu("i3-3");
computer.setGpu("760");
computer.setMouse("双飞燕");
computer.setKeyboard("双飞燕");
computer.setMemory("4G");
}
public Computer getComputer(){
return computer;
}
}
good套餐
public class GoodBuilder extends ComputerBuilder {
private Computer computer ;
@Override
void builder() {
computer = new Computer();
computer.setCpu("i9-10");
computer.setGpu("2060");
computer.setKeyboard("机械");
computer.setMemory("16GSSD");
computer.setMouse("电竞鼠");
}
public Computer getComputer(){
return computer;
}
}
Director 导向器,执行builder的组装
public class ComputerDirector {
public void create(ComputerBuilder builder){
builder.builder();
}
}
client
public class Client {
public static void main(String[] args) {
ComputerBuilder good = new GoodBuilder();
ComputerDirector computerDirector = new ComputerDirector();
computerDirector.create(good);
Computer computer = ((GoodBuilder) good).getComputer();
System.out.println(computer);
}
}
更加常用的方式
构造参数过多时可以用builder构造
Computer
public class Computer {
private String cpu;
private String gpu;
private String memory;
private String keyboard;
private String mouse;
public Computer(Builder builder){
this.cpu = builder.cpu;
this.gpu = builder.gpu;
this.memory = builder.memory;
this.keyboard = builder.keyboard;
this.mouse = builder.mouse;
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", gpu='" + gpu + '\'' +
", memory='" + memory + '\'' +
", keyboard='" + keyboard + '\'' +
", mouse='" + mouse + '\'' +
'}';
}
static class Builder{
private String cpu;
private String gpu;
private String memory;
private String keyboard;
private String mouse;
public Builder(String cpu,String gpu,String memory){
this.cpu=cpu;
this.gpu=gpu;
this.memory=memory;
}
public Builder keyboard(String keyboard){
this.keyboard = keyboard;
return this;
}
public Builder mouse(String mouse){
this.mouse=mouse;
return this;
}
public Computer builder(){
return new Computer(this);
}
}
}
public class client {
public static void main(String[] args) {
Computer computer = new Computer.Builder("i9","2060","16G")
.keyboard("机械").mouse("电竞鼠").builder();
System.out.println(computer);
}
}