介绍
将一个复杂对象的创建与其表示先分离,同样的创建过程可以创建不同的表示。
主要解决: 当系统需要创建一个复杂的对象时,这个对象的各个子对象通常由一定的算法构成,由于需求的变化,各个子对象经常会有很大的变化,但是将它们组合在一起的算法却是稳定的。
何时使用:
- 需要创建一个具有复杂内部结构的对象时,这些内部组件基本不会变,但其组合经常变化的时候
- 需要生成的对象内部属性本身相互依赖
主要优点:
-
建造者独立,容易扩展
-
便于控制细节风险
实现示例
一个电脑由CPU、显卡、内存、主板、电源等组件组成,你是一个卖电脑的老板,需要根据客户不同的需求组建不同的电脑,那此时可以使用建造者模式实现。
电脑
class Computer{
private String cpu;
private String memory;
private String displayCard;
private String powerSource;
private String mainBoard;
private String fan;
private String networkCard;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
public String getDisplayCard() {
return displayCard;
}
public void setDisplayCard(String displayCard) {
this.displayCard = displayCard;
}
public String getPowerSource() {
return powerSource;
}
public void setPowerSource(String powerSource) {
this.powerSource = powerSource;
}
public String getMainBoard() {
return mainBoard;
}
public void setMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
}
public String getFan() {
return fan;
}
public void setFan(String fan) {
this.fan = fan;
}
public String getNetworkCard() {
return networkCard;
}
public void setNetworkCard(String networkCard) {
this.networkCard = networkCard;
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", memory='" + memory + '\'' +
", displayCard='" + displayCard + '\'' +
", powerSource='" + powerSource + '\'' +
", mainBoard='" + mainBoard + '\'' +
", fan='" + fan + '\'' +
", networkCard='" + networkCard + '\'' +
'}';
}
}
电脑建造者
final class ComputerBuilder{
private final Computer computer;
private ComputerBuilder(Computer computer) {
this.computer = computer;
}
public static ComputerBuilder getComputerBuilder(){
return new ComputerBuilder(new Computer());
}
public Computer build(){
return this.computer;
}
public ComputerBuilder setCpu(String cpu) {
this.computer.setCpu(cpu);
return this;
}
public ComputerBuilder setMemory(String memory) {
this.computer.setMemory(memory);
return this;
}
public ComputerBuilder setDisplayCard(String displayCard) {
this.computer.setDisplayCard(displayCard);
return this;
}
public ComputerBuilder setPowerSource(String powerSource) {
this.computer.setPowerSource(powerSource);
return this;
}
public ComputerBuilder setMainBoard(String mainBoard) {
this.computer.setMainBoard(mainBoard);
return this;
}
public ComputerBuilder setFan(String fan) {
this.computer.setFan(fan);
return this;
}
public ComputerBuilder setNetworkCard(String networkCard) {
this.computer.setNetworkCard(networkCard);
return this;
}
}
使用
public class BuilderPattern {
public static void main(String[] args) {
ComputerBuilder computerBuilder = ComputerBuilder.getComputerBuilder();
computerBuilder.setCpu("牙膏厂")
.setDisplayCard("败家眼")
.setMemory("三星")
.setPowerSource("长城");
boolean needFan = false;
boolean needNetworkCard = true;
if(needFan){
computerBuilder.setFan("猫头鹰最强风冷");
}
if(needNetworkCard){
computerBuilder.setNetworkCard("千兆网卡直接起飞");
}
computerBuilder.setMainBoard("华硕主板");
Computer computer = computerBuilder.build();
System.out.println("成品电脑:" + computer.toString());
}
}
/*结果:
成品电脑:Computer{cpu='牙膏厂', memory='三星', displayCard='败家眼', powerSource='长城', mainBoard='华硕主板', fan='null', networkCard='千兆网卡直接起飞'}
*/
源码应用
org.springframework.beans.factory.support.BeanDefinitionBuilder