设计模式之建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它允许你创建一个复杂对象的表示,同时隐藏了构建过程的细节。这种模式允许同样的构建过程创建不同的表示。
概念
建造者模式的核心思想是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。通常,一个产品有多个部分,而构建过程相对复杂,这时候就可以使用建造者模式来实现。
建造者模式包括以下几个角色:
- 产品(Product):需要被构建的复杂对象,包含多个部分。
- 抽象建造者(Builder):声明构建产品各个部分的抽象接口。
- 具体建造者(ConcreteBuilder):实现抽象建造者接口,负责构建产品的具体部分。
- 指挥者(Director):调用具体建造者来构建产品的各个部分,形成一个完整的产品。
原理
建造者模式的原理是通过指挥者控制具体建造者的构建过程,从而实现产品的构建。具体建造者负责构建产品的每个部分,而产品的表示则由产品自身来定义。
实现方式
1. 基本建造者模式
// 产品
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 "Product [part1=" + part1 + ", part2=" + part2 + "]";
}
}
// 抽象建造者
interface Builder {
void buildPart1();
void buildPart2();
Product getResult();
}
// 具体建造者
class ConcreteBuilder implements Builder {
private Product product = new Product();
@Override
public void buildPart1() {
product.setPart1("Part1");
}
@Override
public void buildPart2() {
product.setPart2("Part2");
}
@Override
public Product getResult() {
return product;
}
}
// 指挥者
class Director {
public Product construct(Builder builder) {
builder.buildPart1();
builder.buildPart2();
return builder.getResult();
}
}
// 客户端
public class BuilderPatternExample {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director();
Product product = director.construct(builder);
System.out.println(product);
}
}
这个例子中,产品是一个包含两个部分的对象。抽象建造者定义了构建产品各个部分的接口,具体建造者实现了这些接口,负责构建具体的产品部分。指挥者负责调用具体建造者的方法来构建产品。最后,客户端通过指挥者构建产品。
2. 使用内部静态类的建造者模式
// 产品
class Product {
private String part1;
private String part2;
private Product() {
}
// Getter methods
@Override
public String toString() {
return "Product [part1=" + part1 + ", part2=" + part2 + "]";
}
// 静态内部建造者类
static class Builder {
private Product product = new Product();
public Builder buildPart1(String part1) {
product.part1 = part1;
return this;
}
public Builder buildPart2(String part2) {
product.part2 = part2;
return this;
}
public Product getResult() {
return product;
}
}
}
// 客户端
public class BuilderPatternExample {
public static void main(String[] args) {
Product product = new Product.Builder()
.buildPart1("Part1")
.buildPart2("Part2")
.getResult();
System.out.println(product);
}
}
在这个例子中,产品的构造方法是私有的,通过使用静态内部建造者类,我们可以保持产品的不可变性,并且在构建产品时使用流式接口的方式,使得代码更加清晰。
结语
建造者模式通过将一个复杂对象的构建过程分解为多个简单的步骤,使得构建过程更加灵活,同时也提高了代码的可读性和可维护性。在实际开发中,建造者模式常常用于构建具有多个可选参数的对象,或者构建过程比较复杂的对象。希望本文的介绍能够帮助你更好地理解和使用建造者模式。
评论区