什么是建造者模式?
建造者模式(Builder Pattern)是一种创建型设计模式,它通过将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式包含以下几个关键角色:
-
产品(Product):表示被构建的复杂对象,它包含多个组成部分。
-
抽象建造者(Builder):定义了创建产品各个部分的抽象方法,允许不同的具体建造者实现不同的构建过程。
-
具体建造者(Concrete Builder):实现了抽象建造者的方法,通过具体的构建步骤来创建产品。
-
指挥者(Director):负责调用建造者的方法来创建产品,它定义了构建过程的顺序。
优点:
- 封装性好,创建和使用分离。
- 扩展性好,建造类之间独立、一定程度上解耦。
缺点:
- 产生多余的Builder对象。
- 产品内部发生变化,建造者都要修改,成本较大。
代码实例
// 产品类
class Product {
private String part1;
private String part2;
private String part3;
public void setPart1(String part1) {
this.part1 = part1;
}
public void setPart2(String part2) {
this.part2 = part2;
}
public void setPart3(String part3) {
this.part3 = part3;
}
public void show() {
System.out.println("Part 1: " + part1);
System.out.println("Part 2: " + part2);
System.out.println("Part 3: " + part3);
}
}
// 抽象建造者
interface Builder {
void buildPart1();
void buildPart2();
void buildPart3();
Product getResult();
}
// 具体建造者
class ConcreteBuilder implements Builder {
private Product product;
ConcreteBuilder() {
this.product = new Product();
}
@Override
public void buildPart1() {
product.setPart1("Part 1");
}
@Override
public void buildPart2() {
product.setPart2("Part 2");
}
@Override
public void buildPart3() {
product.setPart3("Part 3");
}
@Override
public Product getResult() {
return product;
}
}
// 指挥者
class Director {
private Builder builder;
Director(Builder builder) {
this.builder = builder;
}
void construct() {
builder.buildPart1();
builder.buildPart2();
builder.buildPart3();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.construct();
Product product = builder.getResult();
product.show();
}
}
产品类 Product
表示要构建的复杂对象,它包含多个部分(part1、part2、part3)。抽象建造者接口 Builder
定义了创建产品各个部分的抽象方法,具体建造者类 ConcreteBuilder
实现了这些方法,通过具体的构建步骤来创建产品。指挥者类 Director
负责调用建造者的方法来创建产品,它定义了构建过程的顺序。
在客户端代码中,首先创建一个具体建造者实例 builder
,然后创建指挥者实例 director
,并将具体建造者传递给指挥者。调用指挥者的 construct
方法来按照一定的顺序构建产品。最后,通过建造者的 getResult
方法获取构建好的产品,并调用产品的 show
方法展示其内容。
建造者模式可以将复杂对象的构建过程抽象出来,使得产品的表示和构建过程解耦,从而可以灵活地组合不同的部分来构建不同的对象。它适用于构建过程稳定但具有不同组合方式的复杂对象,且可以方便地扩展和维护。