天天看點

設計模式——Builder模式

一、概念

将一個複雜對象的建構過程和它的表示分離,使得相同的建構過程建立不同的表示。

二、UML類圖

UML類圖如下圖所示。

角色介紹:

Product産品類-産品的抽象類

Builder-抽象的Builder類,規範産品的組建,一般是由子類實作具體的組建過程;

ConcreteBuilder——具體的Bilder類;

Director——統一組裝過程

設計模式——Builder模式

三、使用場景

1、相同的方法,不同執行順序,産生不同的事件結果時。

2、多個部件或零件,都可以裝配到同一個對象,但是産生運作結果又不相同時。

3、産品類非常複雜,或者産品類地中的調用順序不同産生不同的作用,這個時候使用非常合适。

4、當初始化一個對象非常複雜,如參數多,且很多的參數都具有預設值。

四、代碼實作

public abstract class Computer {
    protected String mBroad;
    protected String mDisplay;
    protected String mOS;

    protected Computer() {

    }

    public void setmBroad(String mBroad) {
        this.mBroad = mBroad;
    }

    public void setmDisplay(String mDisplay) {
        this.mDisplay = mDisplay;
    }

    public abstract void setmOS();

    @Override
    public String toString() {
        return "Computer [mBroad=" + mBroad + ", mDisplay=" + mDisplay
                + ", mOS=" + mOS + "]";
    }

}
           
public class MacBook extends Computer {

    @Override
    public void setmOS() {
        mOS = "Mac os x 12";
    }

}
           
public abstract class Builder {
    // 設定主機
    public abstract void setBuilderBoard(String borad);

    // 設定顯示器
    public abstract void setBuilderDisplay(String display);

    // 設定作業系統
    public abstract void setBuilderOS();

    // 建立計算機
    public abstract Computer createComputer();
}
           
public class MacBuilder extends Builder {
    private Computer maComputer = new MacBook();

    @Override
    public void setBuilderBoard(String borad) {
        maComputer.setmBroad(borad);

    }

    @Override
    public void setBuilderDisplay(String display) {
        maComputer.setmDisplay(display);

    }

    @Override
    public void setBuilderOS() {
        maComputer.setmOS();

    }

    @Override
    public Computer createComputer() {
        // TODO Auto-generated method stub
        return maComputer;
    }

}
           
public class Director {
    Builder mBuilder = null;

    public Director(Builder builder) {
        mBuilder = builder;
    }

    public void construct(String borad, String display) {
        mBuilder.setBuilderBoard(borad);
        mBuilder.setBuilderDisplay(display);
        mBuilder.setBuilderOS();
    }
}
           
public class Test {
    public static void main(String[] args) {
        Builder macBook = new MacBuilder();
        Director director = new Director(macBook);
        director.construct("英特爾", "Retina顯示器");
        System.out.println(macBook.createComputer());
    }
}
           

五、總結

優點:

1、良好的封裝性,可以使用戶端不用知道産品内部組裝的過程。

2、建造者獨立,可擴充性強。

缺點:

會産生多餘的Builder對象和Director對象,消耗記憶體

繼續閱讀