1、概念说明:
使用前提:当一个类的构造函数参数个数超过2个,而且这些参数有些是可选的参数,考虑使用构造者模式。 构造者可以对复杂业务的流程进行随意调整顺序并完成对象的创建,来兼容多个复杂模式;
2、实战
1、本文针对传统和新式的建造者模式都进行描述
2、builder模式有4个角色。Product: 最终要生成的对象,例如 Computer实例。Builder: 构建者的抽象基类(有时会使用接口代替)。其定义了构建Product的抽象步骤,其实体类需要实现这些步骤。其会包含一个用来返回最终产品的方法Product getProduct()。ConcreteBuilder: Builder的实现类。Director: 决定如何构建最终产品的算法. 其会包含一个负责组装的方法void Construct(Builder builder), 在这个方法中通过调用builder的方法,就可以设置builder,等设置完成后,就可以通过builder的 getProduct() 方法获得最终的产品。
2.1传统建造者模式
setup1:产品类,需要建造者产出的对象
public class Computer {
private String cpu;//必须
private String ram;//必须
private int usbCount;//可选
private String keyboard;//可选
private String display;//可选
}
setup2:构建抽象类
public abstract class ComputerBuilder {
public abstract void setUsbCount();
public abstract void setKeyboard();
public abstract void setDisplay();
public abstract Computer getComputer();
}
#steps3 构建实现类: 苹果电脑构建者类
public class MacComputerBuilder extends ComputerBuilder {
private Computer computer;
public MacComputerBuilder(String cpu, String ram) {
computer = new Computer(cpu, ram);
}
@Override
public void setUsbCount() {
computer.setUsbCount(2);
}
@Override
public void setKeyboard() {
computer.setKeyboard("苹果键盘");
}
@Override
public void setDisplay() {
computer.setDisplay("苹果显示器");
}
@Override
public Computer getComputer() {
return computer;
}
}
setps4:导演类,负责组装流程,完成业务
public class Director {
public Computer build(Builder builder){
builder.buildCpu();
builder.buildMainBoard();
builder.buildMemory();
return builder.createComputer();
}
}
setps5:最终使用
public static void main(String[] args) {
ComputerDirector director=new ComputerDirector();//1
ComputerBuilder builder=new MacComputerBuilder("I5处理器","三星125");//2
director.makeComputer(builder);//3
Computer macComputer=builder.getComputer();//4
System.out.println("mac computer:"+macComputer.toString());
}
2.2新式建造者模式
setps1:产品类及产品的builder监造器
package builder;
public class Computer {
private Stringcpu;//必须
private Stringram;//必须
private int usbCount;//可选
private Stringkeyboard;//可选
private Stringdisplay;//可选
private Computer(Builder builder){
this.cpu=builder.cpu;
this.ram=builder.ram;
this.usbCount=builder.usbCount;
this.keyboard=builder.keyboard;
this.display=builder.display;
}
public static class Builder{
private Stringcpu;//必须
private Stringram;//必须
private int usbCount;//可选
private Stringkeyboard;//可选
private Stringdisplay;//可选
public Builder(String cup,String ram){
this.cpu=cup;
this.ram=ram;
}
public BuildersetUsbCount(int usbCount) {
this.usbCount = usbCount;
return this;
}
public BuildersetKeyboard(String keyboard) {
this.keyboard = keyboard;
return this;
}
public BuildersetDisplay(String display) {
this.display = display;
return this;
}
public Computerbuild(){
return new Computer(this);
}
}
public StringgetCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public StringgetRam() {
return ram;
}
public void setRam(String ram) {
this.ram = ram;
}
public int getUsbCount() {
return usbCount;
}
public void setUsbCount(int usbCount) {
this.usbCount = usbCount;
}
public StringgetKeyboard() {
return keyboard;
}
public void setKeyboard(String keyboard) {
this.keyboard = keyboard;
}
public StringgetDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
}
steps2:调用者直接通过链式调用方式,建造产品的逻辑及顺序
public static void main(String[] args) {
Computer computer=new Computer.Builder("因特尔","三星")
.setDisplay("三星24寸")
.setKeyboard("罗技")
.setUsbCount(2)
.build();
}
3、思考
新式建造者模式是老式建造者的变种,也是时代在进化后,对待业务的处理方式的变化,新式建造者模式实际是对老式的简化,简化掉了接口及接口实现;直接由调用者进行管理产品的细节把控;