一、简介
建造者模式(Builder Pattern),又叫生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。通俗来讲,就是将对象的构建过程抽象出来,可用不同的实现类来实现对象的不同特性,达到构建和表示分离的目的。
建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
二、结构图
Product(产品类):具体的产品对象。
Builder(抽象建造者):为了创建Product对象的各个部件指定的抽象接口。
ConcreteBuilder(具体建造者):实现了Builder接口,构造和装配Product各个部件。
Director(指挥者):构建一个使用Builder接口的对象。
三、代码实现
Product类:
由多个部件组成。
public class Product {
List<String> parts = new ArrayList<>();
public void add(String part) {
parts.add(part);
}
public void show() {
parts.forEach(System.out::println);
}
}
Builder接口类:
确定产品有PartA和PartB组成,并声明一个得到产品建造后结果的方法。
public interface Builder {
void buildPartA();
void buildPartB();
Product getResult();
}
Builder的实现类ConcreteBuilderA、ConcreteBuilderB:
两个不同Part的实现类。
public class ConcreteBuilderA implements Builder{
private Product product = new Product();
@Override
public void buildPartA() {
product.add("part A");
}
@Override
public void buildPartB() {
product.add("part B");
}
@Override
public Product getResult() {
return product;
}
}
public class ConcreteBuilderB implements Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.add("part X");
}
@Override
public void buildPartB() {
product.add("part Y");
}
@Override
public Product getResult() {
return product;
}
}
Director类:
public class Director {
public void construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
}
}
测试类:
public class Client {
public static void main(String[] args) {
Director director = new Director();
Builder builderA = new ConcreteBuilderA();
Builder builderB = new ConcreteBuilderB();
director.construct(builderA);
Product productA = builderA.getResult();
productA.show();
director.construct(builderB);
Product productB = builderB.getResult();
productB.show();
}
}
四、注意事项
1、客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
2、每一个具体建造者都相对独立,与其他建造者无关,因此可以很方便的替换具体建造者或增加新的建造者,用户使用不同的建造者即可得到不同的产品对象。
3、建造者模式适用于产品组成部分相似度高的业务,如果产品之间的差异较大,则不适合使用建造者模式。
4、如果产品内部差异较大,则所需建造者就较多,会导致系统庞大。
五、建造者模式和抽象工厂模式
相同点:都抽象了产品的创建过程。
不同点:建造者模式是针对一类产品,不同的创建细节,目的是通过组装部件产生产品;抽象工厂模式是针对一系列产品不同维度的产品,不同维度的产品由不同的工厂类实现。