Builder模式的目的:
將一個複雜對象的構建和它的表示分離,使得同樣的構建過程可以創建不同的表示。
Builder模式的好處:
用戶可以通過該模式一步一步創建一個複雜對象,使得用戶可以在不知道內部構建細節的情況下,可以更精細的控制對象的構件流程。
目前Builder模式多分爲簡略版與經典版
簡略版:
public class Person {
private final String name; //屬性都被final修飾,不可變
private final int age;
private final String phone;
private Person(PersionBuilder builder) { //該bean類構造函數私有,使用者不可以直接調用來創建對象
this.name = builder.name;
this.age = builder.age;
this.phone = builder.phone;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getPhone() {
return phone;
}
public static class PersionBuilder {
private final String name;
private int age;
private String phone;
public PersionBuilder(String name) { //Builder類的構造函數中限定了必須傳的屬性
this.name = name;
}
public PersionBuilder age(int age) {
this.age = age;
return this;
}
public PersionBuilder phone(String phone) {
this.phone = phone;
return this;
}
public Person build() {
return new Person(this);
}
}
}
調用代碼如下:
Person person = new Person.PersionBuilder("小明")
.age(12)
.phone("13111111111")
.build();
經典版:
Builder模式角色介紹:
Product 抽象的產品類
ConcreteProduct 具體的產品類,實現抽象類
Builder 抽象的生產者類,規範生產者功能
ConcreteBuilder 具體的生產者類,實現生產者的各個功能
Director 指揮類,負責指揮建造者進行建造組裝
抽象的產品類:
public abstract class Product {
private String mName;
private String mColor;
public void setName(String name){
this.mName = name;
}
public void setColor(String color){
this.mColor = color;
}
public String getName(){
return mName;
}
public String getColor() {
return mColor;
}
public abstract String showInfoProduct();
}
具體的產品類:
這裏假設該具體產品多了一個Size的需求,得益於多態,可於這裏直接進行功能的擴展
public class ConcreteProduct extends Product {
private int mSize;
@Override
public String showInfoProduct() {
return "Name:" + getName() + " Color:" + getColor() + " " + " Size:" + getSize();
}
public void setSize(int size) {
this.mSize = size;
}
public int getSize() {
return mSize;
}
}
抽象的生產者類
public abstract class Builder {
public abstract void buildName(String name);
public abstract void buildColor(String color);
public abstract Product create();
}
具體的生產者類:
於該產品create時,直接指定了該產品的大小
public class ConcreteBuilder extends Builder {
private ConcreteProduct mProduct = new ConcreteProduct();
@Override
public void buildName(String name) {
mProduct.setName(name);
}
@Override
public void buildColor(String color) {
mProduct.setColor(color);
}
@Override
public Product create() {
mProduct.setSize(10);
return mProduct;
}
}
指揮類:
該類保證了不對外暴露任何生產細節,只需傳入參數,返回對應產品
public class Director {
Builder mBuild=null;
public Director(Builder build){
this.mBuild=build;
}
public Product CreateProduct(String name, String color){
//規範建造流程
this.mBuild.buildName(name);
this.mBuild.buildColor(color);
return mBuild.create();
}
}
調用方法:
Builder mBuilder=new ConcreteBuilder();
Director mDirecror=new Director(mBuilder);
//組裝產品
Product product = mDirecror.CreateProduct("X1","Red");
Log.i("Builder","產品信息:"+product.showInfoProduct());