意图:将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。
情景:生产不同规格的电脑。规格一,规格二
关键点:
- Product(具体产品):表示被构造的复杂对象。
- Builder(抽象构建产品):为创建一个产品对象的各种部件指定抽象接口。
- BuilderImpl(抽象构建的具体实现):实现Builder接口以构造和装配该产品的各个部件,定义并明确它所创建的表示。
- Dircector(建造者):构造一个使用Builder接口的对象。
结构图
代码实现:
电脑实体类
package com.zlfan.builder;
public class Computer {
private String mainBoard;//主板
private String hardDisk;//硬盘
private String cpu;//cpu
public String getMainBoard() {
return mainBoard;
}
public void setMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
}
public String getHardDisk() {
return hardDisk;
}
public void setHardDisk(String hardDisk) {
this.hardDisk = hardDisk;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
@Override
public String toString() {
return "Computer [mainBoard=" + mainBoard + ", hardDisk=" + hardDisk + ", cpu=" + cpu + "]";
}
}
抽象构建产品(电脑)
package com.zlfan.builder;
//抽象生产
public interface Builder {
//构建主板
void buildMainBoard();
//构建硬盘
void buildHD();
//构建CPU
void buildCPU();
Computer buildCopmuter();
}
抽象构建的具体实现 ,规格一的电脑
package com.zlfan.builder;
public class ComputerBuilder implements Builder {
private Computer c = new Computer();
@Override
public void buildMainBoard() {
c.setMainBoard("华硕");
}
@Override
public void buildHD() {
c.setHardDisk("希捷500G");
}
@Override
public void buildCPU() {
c.setCpu("Intel i5");
}
@Override
public Computer buildCopmuter() {
return c;
}
}
建造者
package com.zlfan.builder;
//建造者
public class Director {
public static Computer constructorComputer(Builder builder){
builder.buildMainBoard();
builder.buildHD();
builder.buildCPU();
return builder.buildCopmuter();
}
}
测试结果:
规格二电脑配置方案 技嘉,三星500G,AMD4核,需要再写一个ComputerBuilder2类实现Builder的接口,就可以在建造者中使用了(build)
package com.zlfan.builder;
public class ComputerBuilder2 implements Builder {
private Computer c = new Computer();
@Override
public void buildMainBoard() {
c.setMainBoard("技嘉");
}
@Override
public void buildHD() {
c.setHardDisk("三星500G");
}
@Override
public void buildCPU() {
c.setCpu("AMD 4核");
}
@Override
public Computer buildCopmuter() {
return c;
}
}
生成器模式优缺点
优点:
- 易于解耦,将产品本身与产品创建的过程j进行解耦,可以使用相同的创建过程来得到不同的产品。
- 易于精确控制对象的创建,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。
- 易于拓展,增加新的具体建造者无需原有类库的代码,易于拓展,符合开闭原则。
缺点:
- 生成器(建造者)模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品只见差异过大,则不适合采用该模式,因此其使用范围受到一定的限制。
- 如果产品内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得庞大。
适用性:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。