Java設計模式:建造者模式

作者:網絡 | 發布時間:2020年10月30日 | 閱讀:880

定義:将一(yī)個複雜(zá)對象的構建與它的表示分(fēn)離(lí),使得同樣的構建過程可以創建不同的表示。

類型:創建類模式

類圖:

builder-pattern

四個要素

  • 産品類:一(yī)般是一(yī)個較爲複雜(zá)的對象,也就是說創建對象的過程比較複雜(zá),一(yī)般會有比較多的代碼量。在本類圖中(zhōng),産品類是一(yī)個具體(tǐ)的類,而非抽象類。實際編程中(zhōng),産品類可以是由一(yī)個抽象類與它的不同實現組成,也可以是由多個抽象類與他們的實現組成。

  • 抽象建造者:引入抽象建造者的目的,是爲了将建造的具體(tǐ)過程交與它的子類來實現。這樣更容易擴展。一(yī)般至少會有兩個抽象方法,一(yī)個用來建造産品,一(yī)個是用來返回産品。

  • 建造者:實現抽象類的所有未實現的方法,具體(tǐ)來說一(yī)般是兩項任務:組建産品;返回組建好的産品。

  • 導演類:負責調用适當的建造者來組建産品,導演類一(yī)般不與産品類發生(shēng)依賴關系,與導演類直接交互的是建造者類。一(yī)般來說,導演類被用來封裝程序中(zhōng)易變的部分(fēn)。

代碼實現

    class Product {
        private String name;
        private String type;
        public void showProduct(){
            System.out.println("名稱:"+name);
            System.out.println("型号:"+type);
        }
        public void setName(String name) {
            this.name = name;
        }
        public void setType(String type) {
            this.type = type;
        }
    }

    abstract class Builder {
        public abstract void setPart(String arg1, String arg2);
        public abstract Product getProduct();
    }
    class ConcreteBuilder extends Builder {
        private Product product = new Product();

        public Product getProduct() {
            return product;
        }

        public void setPart(String arg1, String arg2) {
            product.setName(arg1);
            product.setType(arg2);
        }
    }

    public class Director {
        private Builder builder = new ConcreteBuilder();
        public Product getAProduct(){
            builder.setPart("寶馬汽車(chē)","X7");
            return builder.getProduct();
        }
        public Product getBProduct(){
            builder.setPart("奧迪汽車(chē)","Q5");
            return builder.getProduct();
        }
    }
    public class Client {
        public static void main(String[] args){
            Director director = new Director();
            Product product1 = director.getAProduct();
            product1.showProduct();

            Product product2 = director.getBProduct();
            product2.showProduct();
        }
    }

建造者模式的優點

首先,建造者模式的封裝性很好。使用建造者模式可以有效的封裝變化,在使用建造者模式的場景中(zhōng),一(yī)般産品類和建造者類是比較穩定的,因此,将主要的業務邏輯封裝在導演類中(zhōng)對整體(tǐ)而言可以取得比較好的穩定性。

其次,建造者模式很容易進行擴展。如果有新的需求,通過實現一(yī)個新的建造者類就可以完成,基本上不用修改之前已經測試通過的代碼,因此也就不會對原有功能引入風險。

建造者模式與工(gōng)廠模式的區别

我(wǒ)們可以看到,建造者模式與工(gōng)廠模式是極爲相似的,總體(tǐ)上,建造者模式僅僅隻比工(gōng)廠模式多了一(yī)個"導演類"的角色。在建造者模式的類圖中(zhōng),假如把這個導演類看做是最終調用的客戶端,那麽圖中(zhōng)剩餘的部分(fēn)就可以看作是一(yī)個簡單的工(gōng)廠模式了。

與工(gōng)廠模式相比,建造者模式一(yī)般用來創建更爲複雜(zá)的對象,因爲對象的創建過程更爲複雜(zá),因此将對象的創建過程獨立出來組成一(yī)個新的類——導演類。也就是說,工(gōng)廠模式是将對象的全部創建過程封裝在工(gōng)廠類中(zhōng),由工(gōng)廠類向客戶端提供最終的産品;而建造者模式中(zhōng),建造者類一(yī)般隻提供産品類中(zhōng)各個組件的建造,而将具體(tǐ)建造過程交付給導演類。由導演類負責将各個組件按照特定的規則組建爲産品,然後将組建好的産品交付給客戶端。

總結

建造者模式與工(gōng)廠模式類似,他們都是建造者模式,适用的場景也很相似。一(yī)般來說,如果産品的建造很複雜(zá),那麽請用工(gōng)廠模式;如果産品的建造更複雜(zá),那麽請用建造者模式。

相關内容