建造者模式是一种创建型设计模式,它允许你构建一个复杂对象的过程与其表示分离,使得同样的构建过程可以创建不同的表示。
结构
- 产品类(Product): 定义了要构建的复杂对象。
public class Product {
private String part1;
private String part2;
public void setPart1(String part1) {
this.part1 = part1;
}
public void setPart2(String part2) {
this.part2 = part2;
}
// 其他属性和方法
}
- 抽象建造者类(Builder): 定义了构建产品的抽象方法。
public abstract class Builder {
protected Product product = new Product();
public abstract void buildPart1();
public abstract void buildPart2();
public Product getProduct() {
return product;
}
}
- 具体建造者类(Concrete Builder): 实现了抽象建造者类,负责具体的构建过程。
public class ConcreteBuilder extends Builder {
public void buildPart1() {
product.setPart1("Part 1");
}
public void buildPart2() {
product.setPart2("Part 2");
}
}
- 指挥者类(Director): 负责使用建造者来构建复杂对象。
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.buildPart1();
builder.buildPart2();
}
}
优点和缺点
优点:
- 分离构建过程和表示: 建造者模式将构建过程和表示分离,允许你按步骤构造复杂对象,同时使用相同的构建过程来创建不同的表示。
- 更好的控制对象构建: 指挥者负责控制构建过程,可以保证对象的完整性。
- 易于扩展: 可以新增具体的建造者类,不影响已有代码,符合开闭原则。
缺点:
- 增加了类的个数: 引入了建造者模式会增加系统中类的数量,增加了代码复杂度。
- 不适用于简单对象的构建: 如果对象的构建逻辑非常简单,使用建造者模式可能会显得繁琐。
示例
以下是一个建造者模式的示例,构建一个包含两个部分的产品对象:
// 产品类
public class Product {
private String part1;
private String part2;
public void setPart1(String part1) {
this.part1 = part1;
}
public void setPart2(String part2) {
this.part2 = part2;
}
@Override
public String toString() {
return "Part 1: " + part1 + ", Part 2: " + part2;
}
}
// 抽象建造者类
public abstract class Builder {
protected Product product = new Product();
public abstract void buildPart1();
public abstract void buildPart2();
public Product getProduct() {
return product;
}
}
// 具体建造者类
public class ConcreteBuilder extends Builder {
public void buildPart1() {
product.setPart1("Part 1");
}
public void buildPart2() {
product.setPart2("Part 2");
}
}
// 指挥者类
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.buildPart1();
builder.buildPart2();
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.construct();
Product product = builder.getProduct();
System.out.println(product);
}
}
在这个示例中,Director 负责控制构建过程,ConcreteBuilder 负责具体的构建逻辑。通过建造者模式,我们可以按照不同的构建过程创建不同的产品对象。