概述
建造者模式是一种创建型设计模式,它允许用户通过一步步构造复杂对象,而无需知道内部的具体构建细节。这种模式将对象的构造过程与表示分离,从而使得相同的构建过程可以创建不同的表示。建造者模式在需要生成多个具有不同内部结构的同类对象时特别有用,能够提供更加清晰、灵活的解决方案。
目的
封装复杂性:将对象的创建过程封装起来,使得调用者不需要关心对象创建的具体步骤和细节。
分离关注点:将构造代码与表示代码分离,使得两者可以独立变化。
灵活性:通过不同的具体建造者类,可以创建出不同表现形式的产品对象。
可重用性:相同的构建过程可以应用于创建不同的产品,提高代码复用。
构成部分
1. 产品(Product)
产品是建造者模式中的复杂对象,包含多个组成部分。通常定义一个接口或抽象类来规定产品的类型和属性。
2. 抽象建造者(Builder)
定义了一个创建产品对象的接口,但不涉及具体部件的装配方法。一般包含无返回值的buildPartX()方法,用于逐步构建产品。
3. 具体建造者(Concrete Builder)
实现抽象建造者接口,完成具体的产品部件创建和组装任务。在实际应用中,会有多个具体建造者,每个都产生不同表现形式的产品。
4. 指挥者(Director)
负责调用具体建造者对象的构建方法,指导具体建造者一步一步构造最终的产品。这样将产品的构造过程与具体的构造指令解耦,使得构建过程更加灵活可变。
工作流程
客户端通过指挥者类请求创建产品,无需直接操作具体建造者。
指挥者接收到请求后,调用具体建造者的buildPartX()方法,逐步构建产品。
具体建造者根据导演的指示,完成产品的各个部分的构造。
构建完成后,指挥者可以从具体建造者那里获取最终的产品。
适用场景
当创建复杂对象时,希望可以通过子类指定对象的内部构造和表示。
需要创建多种不同表现形式的产品对象,同时避免代码中的大量条件分支判断。
构造过程必须允许被构造的对象有不同的表示,且构造过程必须独立于表示。
代码示例
// 产品接口
interface Product {
void show();
}
// 具体产品
class ConcreteProduct implements Product {
private String partA;
private String partB;
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartB(String partB) {
this.partB = partB;
}
@Override
public void show() {
System.out.println("Product: {partA=" + partA + ", partB=" + partB + "}");
}
}
// 抽象建造者
abstract class Builder {
protected ConcreteProduct product = new ConcreteProduct();
public abstract void buildPartA();
public abstract void buildPartB();
public ConcreteProduct getProduct() {
return product;
}
}
// 具体建造者1
class ConcreteBuilder1 extends Builder {
@Override
public void buildPartA() {
product.setPartA("Part A for ConcreteBuilder1");
}
@Override
public void buildPartB() {
product.setPartB("Part B for ConcreteBuilder1");
}
}
// 指挥者
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.buildPartA();
builder.buildPartB();
}
}
// 客户端代码
public class Client {
public static void main(String[ ] args) {
Director director = new Director(new ConcreteBuilder1());
director.construct();
Product product = director.getBuilder().getProduct();
product.show();
}
}
建造者模式通过将复杂的构建过程封装在不同的建造者中,提供了更加清晰、灵活的解决方案,尤其是在处理具有多个可选配置的产品创建时。通过这种方式,客户端可以专注于描述他们想要什么,而不是如何创建这些对象,提高了代码的可维护性和扩展性。
评论区