建造者模式(Builder)
Builder:建造者模式是一种创建型设计模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
/**
* 建造者模式
*
* @author CAI
* @time 2020/11/5
*/
public class BuilderPattern {
public static void main(String[] args) {
Director director = new Director();
Builder builder1 = new ConcreteBuilder1();
Builder builder2 = new ConcreteBuilder2();
director.construct(builder1);
Product product1 = builder1.getResult();
product1.show();
director.construct(builder2);
Product product2 = builder2.getResult();
product2.show();
}
}
/**
* 产品类:由多个部件组成
*/
class Product {
List<String> parts = new ArrayList<>();
/**
* 添加部件
*
* @param part 产品部件
*/
public void add(String part) { // 添加部件
parts.add(part);
}
/**
* 列举所有的部件
*/
public void show() {
System.out.println("产品 创建------");
for (String part: parts) {
System.out.println(part);
}
}
}
/**
* 建造者接口:产品有两部组成,并有一个返回方法
*/
interface Builder {
/**
* 创建 A 部分
*/
void buildPartA();
/**
* 创建 B 部分
*/
void buildPartB();
/**
* 获得产品
*
* @return 具体产品
*/
Product getResult();
}
/**
* 具体建造者
*/
class ConcreteBuilder1 implements Builder {
private final Product product = new Product();
@Override
public void buildPartA() {
product.add("部件A");
}
@Override
public void buildPartB() {
product.add("部件B");
}
@Override
public Product getResult() {
return product;
}
}
/**
* 具体创建者
*/
class ConcreteBuilder2 implements Builder {
private final Product product = new Product();
@Override
public void buildPartA() {
product.add("部件X");
}
@Override
public void buildPartB() {
product.add("部件Y");
}
@Override
public Product getResult() {
return product;
}
}
/**
* 指挥者类:指挥建造的过程
*/
class Director {
public void construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
}
}
Builder:声明所有类型的构造器中通用的产品构造步骤。ConcreteBuilder:提供构造过程的不同实现,具体的Builder也可以构造不遵循通用接口的产品。Product:最终生成的对象;由不同Builder构造的产品无需属于同一类层次结构或接口。Director:定义调用构造步骤的顺序。- 使用者必须将某个
Builder与Director关联。一般通过Director的构造函数的参数进行一次性关联即可,此后Director就能使用Builder完成后续所有的构造任务。但在客户端将Builder对象传给Director时还有另外一种方式,即:每次使用Director时可以使用不同的Builder。
使用场景
-
使用
Builder模式可以避免重复构造函数的出现。- 若一个类的构造函数存在多个可选参数,创建该对象时会非常不方便;可以考虑提供可选参数比较少的构造对象,使用
Builder模式将对象进行分步骤创建。
- 若一个类的构造函数存在多个可选参数,创建该对象时会非常不方便;可以考虑提供可选参数比较少的构造对象,使用
-
希望使用代码创建不同形式的对象时,可以使用
Builder模式。- 当需要创建的对象仅有不同参数上的差异时,可以使用此模式;通过实现具体步骤来生成特定的对象。
-
当需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,可以考虑使用。
-
主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
优缺点
-
优点:
- 使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者满足单一职责的原则。
- 用户只需指定需要建造的类型就可以得到它们。
- 可以分步骤创建对象,暂缓创建步骤或递归运行创建步骤。
- 生成不同形式的产品时,可以复用相同的制造代码。
-
缺点:
- 使用建造者模式时需要创建多个类,代码的实现会复杂一些。
在 JAVA 中的运用
以
Java的核心库为例
java.lang.StringBuilder: appdend()java.lang.StringBuffer: appdend()java.nio.ByteBuffer: put(),同样的还有CharBuffer, IntBuffer ...等等的put()。