概述
生成器模式是一种创建型设计模式,它提供了一种创建复杂对象的方法,而无需暴露对象的创建过程。这种模式将对象的创建过程分解为多个步骤,并提供了一种逐步构建对象的方法,使得客户端代码可以灵活地指定对象的各个部分。
在Java中,生成器模式通常由一个抽象生成器类和多个具体生成器类实现组成。抽象生成器类定义了一个创建对象的抽象接口,具体生成器类实现了该接口,并负责按照一定的顺序构建对象的各个部分。此外,生成器模式还包括一个指导者类,它负责指导具体生成器类的工作流程。
示例
以下是一个简单的Java代码示例,说明了如何使用生成器模式创建一个复杂对象:
// 抽象生成器类
abstract class Builder {
protected Product product;
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
public Product getResult() {
return product;
}
}
// 具体生成器类1
class ConcreteBuilder1 extends Builder {
public ConcreteBuilder1() {
product = new Product();
}
public void buildPartA() {
product.setPartA("Part A of ConcreteBuilder1");
}
public void buildPartB() {
product.setPartB("Part B of ConcreteBuilder1");
}
public void buildPartC() {
product.setPartC("Part C of ConcreteBuilder1");
}
}
// 具体生成器类2
class ConcreteBuilder2 extends Builder {
public ConcreteBuilder2() {
product = new Product();
}
public void buildPartA() {
product.setPartA("Part A of ConcreteBuilder2");
}
public void buildPartB() {
product.setPartB("Part B of ConcreteBuilder2");
}
public void buildPartC() {
product.setPartC("Part C of ConcreteBuilder2");
}
}
// 产品类
class Product {
private String partA;
private String partB;
private String partC;
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartB(String partB) {
this.partB = partB;
}
public void setPartC(String partC) {
this.partC = partC;
}
public void show() {
System.out.println("Part A: " + partA);
System.out.println("Part B: " + partB);
System.out.println("Part C: " + partC);
}
}
// 指导者类
class Director {
public void construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Director director = new Director();
Builder builder1 = new ConcreteBuilder1();
Builder builder2 = new ConcreteBuilder2();
director.construct(builder1);
Product product1 = builder1.getResult();
product1.show();
director.construct(builder2);
Product product2 = builder2.getResult();
product2.show();
}
}
说明
在上面的代码示例中,抽象生成器类Builder定义了一个创建对象的抽象接口,具体生成器类ConcreteBuilder1和ConcreteBuilder2分别实现了该接口,并负责按照一定的顺序构建对象的各个部分。产品类Product定义了一个复杂对象,它包含了多个部分。指导者类Director负责指导具体生成器类的工作流程。
在客户端代码中,我们首先创建了一个指导者对象director,然后创建了两个具体生成器对象builder1和builder2。指导者对象调用具体生成器对象的方法,按照一定的顺序构建了复杂对象的各个部分。最后,我们通过调用getResult()方法获取了构建好的复杂对象,并调用show()方法显示对象的各个部分。
总结
生成器模式的优点在于,它可以帮助我们创建复杂对象,而无需暴露对象的创建过程。这使得客户端代码可以轻松地指定对象的各个部分,从而创建出不同的对象。此外,生成器模式还可以帮助我们遵循开闭原则,因为我们可以轻松地添加新的具体生成器类,而不需要修改现有的代码。