建造者模式(生成器模式)
是一种创建型的设计模式,允许你分步骤创建复杂对象,通过定义一个用于创建对象的接口,但让子类决定实例化那一个类以及如何初始化这个类。这种模式将对象的构造过程和表示分离出来,使得相同的构造过程可以创建不同的表示。
基本结构
- Builder(抽象建造者):声明一个用于创建产品对象的接口,但一般不涉及具体零件的装配,而是由其子类完成。
- ConcreteBuilder(具体建造者):实现Builder接口,负责创建并组装产品的各个部分。
- Director(指挥者):构建一个使用Builder接口的对象。它负责安排复杂对象的构造步骤,通常包含一个build()方法,该方法调用Builder接口中的方法来完成产品的创建。
- Product(产品):表示被构造的复杂对象。包含定义组件的类,ConcreteBuilder创建这个类的实例。
类图
应用场景
- 主要用于创建一些复杂对象,这些对象内部子对象的建造顺序通常是稳定的,但每个子对象本身的构建通常面临复杂的变化
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
- 当创建过程需要多个步骤,而这些步骤的具体执行顺序可能不同且需要外部指定时。
优点
- 封装性好,用户不需要知道产品内部组成的细节。
- 建造者独立,容易扩展新的建造者来创建不同产品变体。
- 更好的控制复用,建造者可以只变化建造过程的一部分,而不影响其他部分
示例
java
//抽象建造者
interface Builder{
void buildPartA();
void buildPartB();
Product getProduct();
}
//具体建造者
class ConcreteBuilder implements Builder{
private Product product = new Product();
public void buildPartA(){
product.add('part A');
}
public void buildPartA(){
product.add('part B')
}
public Product getProduct(){
return product;
}
}
//指挥者
class Director{
public void construct(Builder builder){
builder.buildPartA();
builder.buildPartB();
}
}
//产品类
class Product{
private List<String> parts = new ArrayList();
public void add(String part){
parts.add(part);
}
public void showProduct(){
for(String part :parts){
System.out.println(part);
}
}
}
public class Client{
public static void main(String[] args){
Builder builer = new ConcreteBuilder();
Director director = new Director();
director.construct(builder);
Prodcut product = builder.getProduct();
product.showProduct();
}
}