// Builder接口
interface ComputerBuilder {
void buildCpu(String cpu);
void buildMemory(String memory);
void buildHardDisk(String hardDisk);
void buildGraphicsCard(String graphicsCard);
void buildMonitor(String monitor);
}
// 具体的Builder类
class AppleBuilder implements ComputerBuilder {
private final Computer computer = new Computer();
@Override
public void buildCpu(String cpu) {
computer.setCpu(cpu);
}
@Override
public void buildMemory(String memory) {
computer.setMemory(memory);
}
@Override
public void buildHardDisk(String hardDisk) {
computer.setHardDisk(hardDisk);
}
@Override
public void buildGraphicsCard(String graphicsCard) {
computer.setGraphicsCard(graphicsCard);
}
@Override
public void buildMonitor(String monitor) {
computer.setMonitor(monitor);
}
public Computer getComputer() {
return computer;
}
}
// Director类
class Director {
void makeComputer(ComputerBuilder builder) {
builder.buildCpu("Intel Core i7");
builder.buildMemory("16GB DDR4");
builder.buildHardDisk("512GB SSD");
builder.buildGraphicsCard("NVIDIA GeForce RTX 3080");
builder.buildMonitor("27 inch 4K IPS");
}
}
// 产品类
class Computer {
private String cpu;
private String memory;
private String hardDisk;
private String graphicsCard;
private String monitor;
// 省略getter和setter方法
@Override
public String toString() {
return "CPU:" + cpu + "\n"
+ "内存:" + memory + "\n"
+ "硬盘:" + hardDisk + "\n"
+ "显卡:" + graphicsCard + "\n"
+ "显示器:" + monitor + "\n";
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
AppleBuilder builder = new AppleBuilder();
Director director = new Director();
director.makeComputer(builder);
Computer computer = builder.getComputer();
System.out.println(computer.toString());
}
}
生成器模式(Builder Pattern)是一种创建型的设计模式,它可以将一个复杂对象的构建过程与其表现分离开来,从而使得同样的构建过程可以创建不同的表示形式。
在生成器模式中,我们通常会定义一个Builder接口或抽象类,用于定义构建复杂对象的方法,同时提供一些操作方法用于设置构建过程中所需要的参数。具体的构建过程由实现了Builder接口或抽象类的具体类负责实现,从而完成复杂对象的创建。
生成器模式的主要优点包括:
-
可以封装复杂对象的构建过程,使得客户端代码不需要知道具体的构建细节。
-
可以让同样的构建过程生成不同的表示形式,从而支持对象的可变性。
-
可以避免使用过多的构造函数重载,使得代码更加简洁易懂。
-
可以增强代码的可读性和可维护性。
生成器模式的主要缺点包括:
-
需要定义多个Builder类或方法,如果构建过程比较简单,可能会导致类或方法的数量过多。
-
在构建过程中可能会产生过多的中间对象,从而增加内存的开销。
总的来说,生成器模式适用于构建复杂对象,并且需要支持不同的表示形式。如果构建过程比较简单,或者只需要一种表示形式,就没有必要使用生成器模式了。同时,需要权衡好与其他创建型设计模式的选择,以及不同实现方式的优缺点,选择最适合自己项目的方式来进行设计。