建造者模式
定義
將一個複雜對象的構建與它的標示分離,使得同樣的構建過程可以創建不同的標示。
簡介
- 建造者模式使用的目的是構造複雜對象,如果對象內部不是很複雜或者功能不是很多,是沒有必要使用建造者模式的
- 使用者可以不用關心建造的過程和細節,只要使用對外提供的公共方法來構造對象即可。
- 關於建造者模式的使用,基本有兩類方式,一種是傳統的外部Builder類的方式,一般是使用靜態內部類Builder的方式去構造對象。
傳統Builder模式
1. 成員
- 1.產品類;
- 2.抽象的Builder類;
- 3.Builder實現類;
- 4.使用者;
2. 實例
我們使用建造者模式的目的,是創建複雜對象,那麼首先,我們就需要這個複雜的對象,即產品類
public class Product{
private int param1;
private int param2;
private int param3;
private int param4;
private int param5;
private int param6;
/**
/* getter and setter
**/
...
@Override
public String toString() {
return ""+param1+param2+param3+param4+param5+param6;
}
}
接下來是此模式的核心——抽象Builder類(接口)
public interface Builder{
void setParam1();
void setParam2();
void setParam3();
void setParam4();
void setParam5();
void setParam6();
Product getProduct();
}
接下來就需要我們的實現類
public class BuilderImpl implements Builder{
private Product product;
public BuilderImpl(){
this.product = new Product();
}
@Override
public void setParam1(){
product.setParam1(1);
}
@Override
public void setParam2(){
product.setParam2(2);
}
@Override
public void setParam3(){
product.setParam3(3);
}
@Override
public void setParam4(){
product.setParam4(4);
}
@Override
public void setParam5(){
product.setParam5(5);
}
@Override
public void setParam6(){
product.setParam6(6);
}
@Override
public Product getProduct() {
return product;
}
}
最後我們實現一下使用類
public class Use{
private Builder builder;
public void setBuilder(Builder builder){
this.builder = builder;
}
public void createComputer(){
builder.setParam1();
builder.setParam2();
builder.setParam3();
builder.setParam4();
builder.setParam5();
builder.setParam6();
}
public Product getProduct(){
return builder.getProduct();
}
}
3.使用
public class Test{
public static void main(String[] args){
Use use = new Use();
use.setBuilder(new BuilderImpl ());
use.createProduct();
log.i("Product",use.toString());
}
}
輸出:
Product:"21"
改革Builder模式 —— 靜態內部類Builder
1.成員
只有產品類和內部Builder類
public class Product{
public static class Builder{
}
}
2.實例
public class Product{
private final String param1;
private final String param2;
private final String param3;
private Product(Builder builder){
this.param1 = builder.param1;
this.param2 = builder.param2;
this.param3 = builder.param3;
}
public static class Builder{
private final String param1;
private String param2;
private String param3;
public Builder(String param1){
this.param1 = param1;
}
public Builder param2(){
this.param2 = param2;
return this;
}
public Builder param3(){
this.param3 = param3;
return this;
}
public Product build(){
return new Product(this);
}
}
}
3.使用
public class Use{
public static void main(String[] args){
Product p = new Product.Builder("param1")
.param2("param2")
.param3("param3")
.build();
}
}
總結
- 我們其實使用過很多建造者模式,例如,AlertDialog的Builder。
- 建造者模式是用來創建複雜對象的,如果只是普通的對象,內部邏輯較少或者內部屬性不多就沒有必要使用建造者模式(以上兩個例子就沒必要用Builder模式,本人只是用作樣例)
優缺點
優點 | 封裝性良好,易於解耦,易於擴展,易於精確控制對象的創建 |
---|---|
缺點 | 產生多餘的Build對象,如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制 |