1. 程式人生 > >二、Builder設計模式

二、Builder設計模式

1. Builder模式的介紹

將一個複雜物件的構建和它的表示分離,使得同樣的構建過程可以建立不同的表示。

2. Builder模式使用場景

  • 相同的方法,不同的執行順序,產生不同的事件結果時。
  • 多個部件或零件,都可以裝配到一個物件中,但是產生的執行結果又不相同時。
  • 產品型別非常複雜,或者產品類中呼叫順序不同產生了不同的作用,這個使用建造者模式非常適合。
  • 當初始化一個物件特別複雜,如引數多,且很多引數都有預設值時。

3. Builder模式的UML類圖

建造者模式

4. Builder模式Java程式碼

計算機的組裝比較複雜,組裝順序是不固定的。將計算機的組裝的過程簡化為構建主機、設定作業系統、設定顯示器3個部分,然後通過Director和具體的Builder來構建計算機物件。

  • 1.計算機抽象類:Product角色
public abstract class Computer {
            protected String mBorad;
            protected String mDisplay;
            protected String mOs;

            protected Computer() {
            }

            //設定主機板
            public void setBorad(String borad) {
                this
.mBorad = borad; } //設定記憶體 public void setDisplay(String display) { this.mDisplay = display; } //設定作業系統 public abstract void setOs(); @Override public String toString() { return
"Computer{" + "mBorad='" + mBorad + '\'' + ", mDisplay='" + mDisplay + '\'' + ", mOs='" + mOs + '\'' + '}'; } }
  • 2.具體的Computer類,Macbook
public class MacBook extends Computer {
            protected MacBook() {

            }

            @Override
            public void setOs() {
                mOs = "Mac OSX X 10.0";
            }
        }
  • 3.抽象Builder類:
public abstract class Builder {

            //設定主機
            public abstract void buildBorad(String borad);

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

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

            public abstract Computer create();

        }
  • 4.具體的Builder類:
public class MacBookBuilder extends Builder {
            private Computer mComputer = new MacBook();

            @Override
            public void buildBorad(String borad) {
                mComputer.setBorad(borad);
            }

            @Override
            public void buildDisplay(String display) {
                mComputer.setDisplay(display);
            }

            @Override
            public void buildOs() {
                mComputer.setOs();
            }

            @Override
            public Computer create() {
                return mComputer;
            }
        }
  • 5.Director類,負責構造Computer
public class Director {
            Builder mBuilder = null;

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

            public void construct(String board, String display) {
                mBuilder.buildBorad(board);
                mBuilder.buildDisplay(display);
                mBuilder.buildOs();
            }
        }
  • 6.測試程式碼:
public class Test {
            public static void main(String[] args) {
                Builder macBookBuilder = new MacBookBuilder();
                //Director
                Director director = new Director(macBookBuilder);

                director.construct("英特爾主機板", "Retina顯示器");

                System.out.println("Computer Info: " + macBookBuilder.create().toString());
            }
        }

  • 7.注意:
    以上程式碼中,通過具體的MacbookBuilder來構建MacBook物件,而Director封裝了構建複雜產品產生的過程,對外隱藏了細節。
    在現實開發過程中,Director角色經常會被忽略。而直接使用一個Builder來進行物件的封裝,這個Builder通常為鏈式呼叫,關鍵點是每個setter方法都返回自身。

new TestBuidler.setA(“A”).setB(“B”).create();

5. Builder模式在Android系統中

在Android原始碼中,最常用到的Builder模式就是AlertDialog.Builder,使用該Builder來夠加你複雜的AlertDialog物件。

6. 總結

Builder 模式在Android開發中也較為常用,通常作為配置類的構建器將構建和表示分離開來,同時也是將配置從目標類中分離出來,避免過多的setter方法。Builder模式比較常見的實現方式是通過呼叫鏈實現,這樣使得程式碼更簡潔。