1. 程式人生 > >建造者模式(Builder Pattern)

建造者模式(Builder Pattern)

pub 圖片 imp 客戶端 問題 復雜 override 適合 type

定義: 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示 解決的問題:
  • 方便用戶創建復雜的對象(不需要知道實現過程)
  • 代碼復用性 & 封裝性(將對象構建過程和細節進行封裝 & 復用)
uml類圖: 技術分享圖片 模式組成:
  • Builder:抽象建造者。為創建一個產品對象的各個部件指定抽象接口
  • ConcreteBuilder:具體建造者。實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並提供一個檢索產品的接口
  • Director:指揮者。構造一個使用Builder接口的對象,指導構建過程
  • Product:產品角色
    。表示被構造的復雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口
優點:
    • 易於解耦將產品本身與產品創建過程進行解耦,可以使用相同的創建過程來得到不同的產品。也就說細節依賴抽象
    • 易於精確控制對象的創建。將復雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰
    • 易於拓展增加新的具體建造者無需修改原有類庫的代碼,易於拓展,符合“開閉原則“。 每一個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,用戶使用不同的具體建造者即可得到不同的產品對象。
缺點:
  • 建造者模式所創建的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制
  • 如果產品的內部變化復雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大
舉個栗子: 定義抽象建造者
interface IBuilder {
    public void builderCPU();
    public void builderMainboard();
    public Computer getComputer();
}

定義具體建造者

class DellComputerBuilder implements
IBuilder { Computer c = new Computer(); @Override public void builderCPU() { c.setCpu("dell type"); } @Override public void builderMainboard() { c.setMainBoard("dell type"); } @Override public Computer getComputer() { return c; } }

定義指揮者

class Director {
    public void construct(IBuilder builder) {
        builder.builderCPU();
        builder.builderMainboard();
    }
}

定義產品

class Computer {
    String cpu;
    String mainBoard;

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }
    public void setMainBoard(String mainBoard) {
        this.mainBoard = mainBoard;
    }
    @Override
    public String toString() {
        return "im a computer , my cpu is " + cpu + ",my main board is " + mainBoard;
    }
}

客戶端調用

public static void main(String[] args) {
        IBuilder builder = new DellComputerBuilder();
        Director dt = new Director();
        dt.construct(builder);
        Computer c = builder.getComputer();
        System.out.println(c.toString());
    }

輸出

技術分享圖片

建造者模式(Builder Pattern)