設計模式詳解|建造者模式

目錄

 

概述

數據結構

優缺點

實現


概述

建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個複雜的對象。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。

一個 Builder 類會一步一步構造最終的對象。該 Builder 類是獨立於其他對象的。

建造者模式:將一個複雜對象的構建與它的表示分離,使得相同的構建過程可以創建不同的表示。

它關注如何一步一步的創建一個複雜的對象,如果用了建造者模式,那麼用戶就只需要指定需要建造的類型就可以得到它們,而具體建造的過程和細節就不需要知道了。

工廠類模式提供的是創建單個類的模式,而建造者模式則是將各種產品集中起來進行管理用來創建複合對象,所謂複合對象就是指某個類具有不同的屬性,其實建造者模式就是前面抽象工廠模式和最後的Test結合起來得到的。 

主要解決:主要解決在軟件系統中,有時候面臨着"一個複雜對象"的創建工作,其通常由各個部分的子對象用一定的算法構成;其組合是經常變化的。


數據結構

Product: 最終要生成的對象,例如 Computer實例。

Builder: 構建者的抽象基類(有時會使用接口代替)。其定義了構建Product的抽象步驟,其實體類需要實現這些步驟。其會包含一個用來返回最終產品的方法Product getProduct()

ConcreteBuilder: Builder的實現類。

Director: 決定如何構建最終產品的算法. 其會包含一個負責組裝的方法void Construct(Builder builder), 在這個方法中通過調用builder的方法,就可以設置builder,等設置完成後,就可以通過builder的 getProduct() 方法獲得最終的產品。


優缺點

優點: 1、建造者獨立,易擴展。 2、便於控制細節風險。

缺點: 1、產品必須有共同點,範圍有限制。 2、如內部變化複雜,會有很多的建造類。

使用場景: 1、需要生成的對象具有複雜的內部結構。 2、需要生成的對象內部屬性本身相互依賴。

注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。


實現

Product類:

public class Product {
    List<String> parts=new ArrayList<>();
    public void add(String part){
        parts.add(part);
    }
    public void show(){
        System.out.print("產品創建");
        for(String p:parts){
            System.out.print(p+" ");
        }
        System.out.println();
    }
}

Builder類

public abstract class Builder {
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract Product GetResult();
}

ConcreteBuilder1

public class ConcreteBuilder1 extends Builder{
    Product product=new Product();
    @Override
    public void buildPartA() {
        product.add("A");
    }

    @Override
    public void buildPartB() {
        product.add("B");
    }

    @Override
    public Product GetResult() {
        return product;
    }
}

ConcreteBuilder2

public class ConcreteBuilder2 extends Builder{
    Product product=new Product();
    @Override
    public void buildPartA() {
        product.add("X");
    }

    @Override
    public void buildPartB() {
        product.add("Y");
    }

    @Override
    public Product GetResult() {
        return product;
    }
}

HouseDirector

public class Director {
    public void Construct(Builder builder){
        builder.buildPartA();
        builder.buildPartB();
    }
}

Client

public class Client {
    public static void main(String[] args) {
        Director director=new Director();
        Builder builder1=new ConcreteBuilder1();
        Builder builder2=new ConcreteBuilder2();
        director.Construct(builder1);
        Product p1=builder1.GetResult();
        p1.show();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章