建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
该模式的主要优点如下:
各个具体的建造者相互独立,有利于系统的扩展。
客户端不必知道产品内部组成的细节,便于控制细节风险。
其缺点如下:
产品的组成部分必须相同,这限制了其使用范围。
如果产品的内部变化复杂,该模式会增加很多的建造者类。
产品角色
/**
* 包含多个组成部件的复杂对象。
* 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
* 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
* 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
* 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
**/
class Product {
private String partA;
private String partB;
private String partC;
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartA(String partB) {
this.partA = partB;
}
public void setPartA(String partC) {
this.partA = partC;
}
@Override
public String toString() {
return "Product {" +
"partA='" + partA + '\'' +
", partB='" + partB + '\'' +
", partC='" + partC + '\'' +
'}';
}
public void show() {
System.out.println("展示产品:" + this.toString());
}
}
抽象建造者
/**
* 包含创建产品各个子部件的抽象方法。
**/
abstract class Builder {
protected Product product = new Product();
public abstart void buildPartA();
public abstart void buildPartB();
public abstart void buildPartC();
public Product getResult() {
retrun product;
}
}
public class ConcreteBuilder extends Builder {
public void buidlerPartA() {
product.setPartA("建造 PartA");
}
public void buidlerPartB() {
product.setPartA("建造 PartB");
}
public void buidlerPartC() {
product.setPartA("建造 PartC");
}
}
指挥者
/**
* 调用建造者中的方法完成复杂对象的创建。
**/
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Product construct() {
builder.builderPartA();
builder.builderPartB();
builder.builderPartC();
return builder.getResult();
}
}
客户类
public class Client {
public static void main(String[] args) {
Builder builder = new ConcreteBuidler();
Director director = new Directore(builder);
Product product = director.constract();
product.show()
}
}
网友评论