建造者模式概述
- Builder模式(建造者模式),将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
- 当一个类的构造方法中参数过多时, 有些是可选的参数,可以考虑使用Builder模式。
- Builder模式分二种,一种是经典的Builder模式,第二种是变种Builder模式,而现在Android开发普遍使用的是第二种的变种Builder模式
经典的Builder模式

Builder模式里的四种角色
- Builder:抽象的建造者。
- ConcreteBuilder:具体的建造者,继承自Builder,通常不止一个
- Product:被构造的复杂对象
- Director:指挥者,指挥建造者去建造一个产品
/**
* 抽象建造者类
*
*/
public abstract class Builder {
public abstract void setName();
public abstract void setSize();
public abstract Product getProduct;
}
----------------------------------------------------------------------------------------------------
/**
* 指挥者类
*
*/
public class Director {
public void construct(Builder builder) {
builder.setName();
builder.setSize();
}
}
----------------------------------------------------------------------------------------------------
/**
* 产品类
*
*/
public class Product {
private String name;
private int size
public Product (String name, int size){
this.name =name;
this.size = size;
}
public void show() {
System.out.println("名称: " + name + "尺寸:"+size);
}
}
----------------------------------------------------------------------------------------------------
/**
* ConcreteBuilder
*
*/
public class ConcreteBuilder extends Builder {
private Product product ;
public ConcreteBuilder (String name, int size) {
product = new Product (name, name);
}
@Override
public void setName(String name) {
product.name =name;
}
@Override
public void setSize(int size) {
product.size = size;
}
@Override
public Product getProduct() {
return product;
}
}
----------------------------------------------------------------------------------------------------
/**
* 客户端调用,建造者模式(Builder)
*
*/
public class Client {
public static void main(String[] args) {
Director director = new Director();
Builder builder = new ConcreteBuilder();
director.construct(builder );
Product product = builder.getProduct();
product.show();
}
}

/**
* 产品
*/
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() {
//显示产品的特性
}
}
----------------------------------------------------------------------------------------------------
/**
* 指挥者:调用建造者中的方法完成复杂对象的创建。
*/
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
//产品构建与组装方法
public void construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
public Product getProduct (){
return builder.getProduct ();
}
}
----------------------------------------------------------------------------------------------------
/**
* 抽象建造者:包含创建产品各个子部件的抽象方法。
*/
abstract class Builder {
//创建产品对象
protected Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//返回产品对象
public Product getProduct () {
return product;
}
}
----------------------------------------------------------------------------------------------------
/**
* 具体建造者:实现了抽象建造者接口。
*/
public class ConcreteBuilderA extends Builder {
public void buildPartA() {
product.setPartA("A建造 PartA");
}
public void buildPartB() {
product.setPartB("A建造 PartB");
}
public void buildPartC() {
product.setPartC("A建造 PartC");
}
}
----------------------------------------------------------------------------------------------------
/**
* 具体建造者:实现了抽象建造者接口。
*/
public class ConcreteBuilderB extends Builder {
public void buildPartA() {
product.setPartA("B建造 PartA");
}
public void buildPartB() {
product.setPartB("B建造 PartB");
}
public void buildPartC() {
product.setPartC("B建造 PartC");
}
}
----------------------------------------------------------------------------------------------------
/**
* 客户类
*/
public class Client {
public static void main(String[] args) {
Builder builderA = new ConcreteBuilderA();
Builder builderB = new ConcreteBuilderB();
Director director = new Director(builderA );
Product productA = director .getResult();
productA .show();
Director director = new Director(builderB);
Product productB = director .getResult();
productB .show();
}
}
变种Builder模式
- 在Product 中创建一个静态内部类 Builder,然后将Product 中的参数都复制到Builder类中。
- 在Builder中创建设置函数,对Product 中那些可选参数进行赋值,返回值为Builder类型的实例
- 在Builder中创建一个build()方法,在其中构建Product 的实例并返回
- Product 类的构造方法可以设置私有的。也就是说调用者不能直接创建Product 对象,必须通过Builder创建
- Builder的内部类构造方法中只接收必传的参数,并且该必传的参数可以用final修饰符
public class Product{
private final String firstName; // 必传参数
private final String lastName; // 必传参数
private final int age; // 可选参数
private final String phone; // 可选参数
private final String address; // 可选参数
private User(Builder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.phone = builder.phone;
this.address = builder.address;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public String getPhone() {
return phone;
}
public String getAddress() {
return address;
}
public static class Builder {
private final String firstName;
private final String lastName;
private int age;
private String phone;
private String address;
public Builder(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;
}
public UserBuilder address(String address) {
this.address = address;
return this;
}
public Productbuild() {
return new Product(this);
}
}
}
客户端链式调用
public class Client {
public static void main(String[] args) {
new Product.Builder("艺术", "小二")
.age(20)
.phone("123456789")
.address("中国")
.build();
}
}
网友评论