封装一个复杂对象的构建过程,可以按照流程来构建对象。
-
优点:它可以将一个复杂对象的构建与表示相分离,同一个构建过程,可以构成出不同的产品,简化了投建逻辑。
-
缺点:如果构建流程特别复杂,就是导致这个构建系统过于庞大,不利于控制。
// 产品类
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 void setUsbCount(int usbCount) {
this.usbCount = usbCount;
}
public void setKeyboard(String keyboard) {
this.keyboard = keyboard;
}
public void setDisplay(String display) {
this.display = display;
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", ram='" + ram + '\'' +
", usbCount=" + usbCount +
", keyboard='" + keyboard + '\'' +
", display='" + display + '\'' +
'}';
}
}
// 抽象建造者
public abstract class ComputerBuilder {
public abstract void setUsbCount();
public abstract void setKeyboard();
public abstract void setDisplay();
public abstract Computer getComputer();
}
// 苹果电脑构建者类
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;
}
}
// 联想电脑构建者类
public class LenovoComputerBuilder extends ComputerBuilder {
private Computer computer;
public LenovoComputerBuilder(String cpu, String ram) {
computer=new Computer(cpu,ram);
}
@Override
public void setUsbCount() {
computer.setUsbCount(4);
}
@Override
public void setKeyboard() {
computer.setKeyboard("联想键盘");
}
@Override
public void setDisplay() {
computer.setDisplay("联想显示器");
}
@Override
public Computer getComputer() {
return computer;
}
}
// 指导者类(Director)
public class ComputerDirector {
public Computer makeComputer(ComputerBuilder builder){
builder.setUsbCount();
builder.setDisplay();
builder.setKeyboard();
return builder.getComputer();
}
}
// 使用
public static void main(String[] args) {
ComputerDirector director=new ComputerDirector();//1
ComputerBuilder builder=new MacComputerBuilder("I5处理器","三星125");//2
Computer macComputer = director.makeComputer(builder);//3
System.out.println("mac computer:"+macComputer.toString());
ComputerBuilder lenovoBuilder=new LenovoComputerBuilder("I7处理器","海力士222");
Computer lenovoComputer=director.makeComputer(lenovoBuilder);
System.out.println("lenovo computer:"+lenovoComputer.toString());
}
简化版
public class Product {
private String board;
private String display;
private String os;
public String getBoard() {
return board;
}
public String getDisplay() {
return display;
}
public String getOs() {
return os;
}
private Product(Builder builder) {
// 进行构建
this.board = builder.board;
this.display = builder.display;
this.os = builder.os;
}
public static class Builder {
// 建造者模式还可以设置默认值
private String board = "default value";
private String display = "default value";
private String os = "default value";
public void setBoard(String board) {
this.board = board;
}
public void setDisplay(String display) {
this.display = display;
}
public void setOs(String os) {
this.os = os;
}
public Product build() {
return new Product(this);
}
}
}
根据以下文章总结:
-
Java设计模式:23种设计模式全面解析(超级详细)HYPERLINK http://c.biancheng.net/design_pattern/ n委派模式在JDK以及Spring源码中的应用_蒙奇D灬小武的博客-优快云博客
-
设计模式 https://blog.youkuaiyun.com/shusheng0007/category_8638565.html 永不磨灭的设计模式(有这一篇真够了,拒绝标题党)_ShuSheng007的博客-优快云博客_永不磨灭的设计模式
-
java设计模式 https://blog.youkuaiyun.com/qq_37909508/category_8976362.html
-
设计模式 在源码中的应用 https://blog.youkuaiyun.com/qq_36970993/category_10620886.html
-
Android系统设计中存在设计模式分析 https://www.2cto.com/kf/201208/150650.html
-
Android设计模式系列 - 基于android的各种代码分析各种设计模式 https://www.cnblogs.com/qianxudetianxia/category/312863.html