面试题答案
一键面试构建者模式独特优势
- 复杂对象构建:构建者模式专注于逐步构建复杂对象,而工厂模式通常创建相对简单对象,单例模式确保对象全局唯一实例。例如创建一个复杂的游戏角色对象,该对象有多种属性如生命值、攻击力、防御力、技能等,构建者模式可按步骤分别设置这些属性,而工厂模式一次性创建可能难以处理这么多复杂逻辑。
- 解耦构建过程与表示:构建者模式将对象构建过程和最终表示分离,使得同样的构建过程可以创建不同表示的对象。而单例模式无此特点,工厂模式虽能创建不同类型对象,但构建过程和对象表示耦合度较高。比如一个文档生成系统,可使用相同的构建过程生成HTML格式、PDF格式等不同表示的文档。
适用场景
- 对象创建过程复杂:当创建对象的过程涉及多个步骤,且这些步骤顺序固定或者有多种可选组合时,适合使用构建者模式。例如创建一个复杂的配置文件对象,需要先读取默认配置,然后根据环境变量修改部分配置,最后进行配置校验等步骤。
- 需要创建不同表示的对象:如前面提到的文档生成系统,相同的构建逻辑可生成不同格式文档。
代码示例
// 产品类
class Computer {
private String cpu;
private String ram;
private String storage;
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void setRam(String ram) {
this.ram = ram;
}
public void setStorage(String storage) {
this.storage = storage;
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", ram='" + ram + '\'' +
", storage='" + storage + '\'' +
'}';
}
}
// 抽象构建者
abstract class ComputerBuilder {
protected Computer computer = new Computer();
public abstract void buildCpu();
public abstract void buildRam();
public abstract void buildStorage();
public Computer getComputer() {
return computer;
}
}
// 具体构建者
class HighEndComputerBuilder extends ComputerBuilder {
@Override
public void buildCpu() {
computer.setCpu("Intel Core i9");
}
@Override
public void buildRam() {
computer.setRam("32GB DDR4");
}
@Override
public void buildStorage() {
computer.setStorage("1TB SSD");
}
}
// 指挥者
class Director {
private ComputerBuilder computerBuilder;
public Director(ComputerBuilder computerBuilder) {
this.computerBuilder = computerBuilder;
}
public Computer construct() {
computerBuilder.buildCpu();
computerBuilder.buildRam();
computerBuilder.buildStorage();
return computerBuilder.getComputer();
}
}
// 客户端
public class Main {
public static void main(String[] args) {
ComputerBuilder highEndBuilder = new HighEndComputerBuilder();
Director director = new Director(highEndBuilder);
Computer highEndComputer = director.construct();
System.out.println(highEndComputer);
}
}
在上述代码中,构建一个复杂的 Computer
对象,通过构建者模式,将构建过程(ComputerBuilder
的具体实现)和对象本身(Computer
)分离,且可以通过不同的 ComputerBuilder
实现构建不同类型的电脑,而工厂模式或单例模式在这种场景下无法如此灵活且清晰地处理复杂对象的构建过程。所以在类似这种复杂对象构建场景下应优先选择构建者模式。