抽象工厂模式(Abstract Factory)模式定义? 应用场景是啥? 有几种模式?分别示例
建造者模式定义:
建造者模式(Builder Pattern)是一种创建型设计模式,它解决了复杂对象的构建问题。与工厂模式不同,建造者模式不仅仅创建一个实例,而是通过一步一步地构造过程来创建复杂对象的各个部分。这种模式允许用户在不了解内部构建细节的情况下,通过指定类型和内容就能构建复杂的对象。
应用场景:
- 创建复杂对象:当创建的对象需要很多步骤,这些步骤需要按照特定的顺序或配置进行时,建造者模式特别有用。
- 参数数量过多:当构造方法的参数太多,导致可读性差和参数配置错误的时候,使用建造者模式可以提高代码的可读性和易用性。
- 需要不同表示:当需要构造多个不同表示或实现的对象时,建造者模式提供了一个清晰的解决方案。
- 对象组件之间构建的顺序很重要:如果产品内部构建顺序影响最终产品时,建造者模式可以强制执行这一过程。
建造者模式的实现:
// 产品类
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("PartA: " + partA);
System.out.println("PartB: " + partB);
System.out.println("PartC: " + partC);
}
}
// 抽象建造者
abstract class Builder {
protected Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
public Product getResult() {
return product;
}
}
// 具体建造者
class ConcreteBuilder extends Builder {
public void buildPartA() {
product.setPartA("Build PartA");
}
public void buildPartB() {
product.setPartB("Build PartB");
}
public void buildPartC() {
product.setPartC("Build PartC");
}
}
// 指挥者
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
// 构建产品,按照顺序来构建
public void construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
// 客户端代码
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();
}
}
在这个例子中,Director
类负责按照特定的顺序构建产品,客户端只需要调用指挥者的构建方法即可得到一个完整的产品对象。Builder
类提供了构建产品各个部分的抽象接口,而ConcreteBuilder
类实现了这些方法来创建具体的产品。
注意事项:
- 建造者模式和抽象工厂模式有时候一起使用,建造者负责创建复杂对象的各个部分,而抽象工厂负责创建复杂对象的家族。
- 建造者模式通常会有一个"流式"接口,也就是说每个设置器(setter)方法都会返回
this
对象,允许链式调用,从而提高可读性和易用性。 - 建造者模式在一些语言中可以通过可变参数、默认参数值等语言特性来简化。例如,在Java中,可以使用重载的构造函数和链式调用;在Python中,可以使用关键字参数来避免复杂的构建器类。