首頁 > 軟體

Java設計模式之建造者模式的範例詳解

2022-02-16 13:00:28

定義

建造者模式(Builder Pattern),又叫生成器模式,是一種物件構建模式 它可以將複雜物件的建造過程抽象出來,使這個抽象過程的不同實現方法可以構造出不同表現的物件。建造者模式是一步一步建立一個複雜的物件,它允許使用者只通過指定複雜物件的型別和內容就可 以構建它們,使用者不需要知道內部的具體構建細節。

案例

需求

女生每天化妝,假如只需要做髮型,香水,衣服,並要求按照發型——》香水——》衣服的順序進行,用程式碼實現

方案一

定義女生抽象類

/**
 * 女生抽象類
 * @author:liyajie
 * @createTime:2022/2/16 10:20
 * @version:1.0
 */
public abstract class AbstractWoman {
    //設計髮型
    public abstract void buildHairstyle();
    //使用香水
    public abstract void buildPerfume();
    //設計衣服
    public abstract void buildClothing();
}

定義女生實現類

/**
 * 女生實現類
 * @author:liyajie
 * @createTime:2022/2/16 10:21
 * @version:1.0
 */
public class Woman extends AbstractWoman {
    @Override
    public void buildHairstyle() {
        System.out.println("馬尾造型");
    }

    @Override
    public void buildPerfume() {
        System.out.println("古龍香水");
    }

    @Override
    public void buildClothing() {
        System.out.println("海瀾之家");
    }
}

測試類

/**
 * 測試類
 * @author:liyajie
 * @createTime:2022/2/15 16:35
 * @version:1.0
 */
public class Test {
    public static void main(String[] args) {
        Woman woman = new Woman();
        woman.buildHairstyle();
        woman.buildPerfume();
        woman.buildClothing();
        System.out.println(woman);
    }
}

檢視測試結果

方案二

定義女生類

/**
 * 女生化妝
 * @author:liyajie
 * @createTime:2022/2/15 15:40
 * @version:1.0
 */
@Data
public class WomanNew {
    // 髮型
    private String hairstyle;
    // 香水
    private String perfume;
    // 服裝
    private String clothing;

    //化完妝後的展示效果
    public void show(){
        System.out.println("化妝完成");
    }
}

定義化妝師抽象類

/**
 * 化妝師抽象類
 * @author:liyajie
 * @createTime:2022/2/15 15:58
 * @version:1.0
 */
public abstract class AbstractDresserNew {
    protected Woman woman = new Woman();

    //設計髮型
    public abstract void buildHairstyle();
    //使用香水
    public abstract void buildPerfume();
    //設計衣服
    public abstract void buildClothing();

    public Woman getWoman(){
        return woman;
    }
}

定義具體的化妝師類

/**
 * 具體的化妝師
 * @author:liyajie
 * @createTime:2022/2/15 16:17
 * @version:1.0
 */
public class DresserNew extends AbstractDresserNew{
    @Override
    public void buildHairstyle() {
        woman.setHairstyle("馬尾造型");
    }

    @Override
    public void buildPerfume() {
        woman.setPerfume("古龍香水");
    }

    @Override
    public void buildClothing() {
        woman.setClothing("海瀾之家");
    }
}

定義化妝總設計師類(指揮者)

/**
 * 化妝總設計師(指揮者)
 * @author:liyajie
 * @createTime:2022/2/15 16:22
 * @version:1.0
 */
public class DresserManage {

    private AbstractDresser abstractDresser;

    public DresserManage(AbstractDresser abstractDresser){
        this.abstractDresser = abstractDresser;
    }

    public Woman makeUp(){
        abstractDresser.buildHairstyle();
        abstractDresser.buildPerfume();
        abstractDresser.buildClothing();
        return abstractDresser.getWoman();
    }
}

定義測試類

/**
 * 測試類
 * @author:liyajie
 * @createTime:2022/2/15 16:35
 * @version:1.0
 */
public class TestNew {
    public static void main(String[] args) {
        DresserNew dresser = new DresserNew();
        DresserManage dresserManage = new DresserManage(dresser);
        WomanNew womanNew = dresserManage.makeUp();
        System.out.println(womanNew);
    }
}

檢視結果

對比分析

  • 方案一:普通的實現方式,採用了繼承抽象類的方式進行實現,耦合性非常高,不易擴充套件
  • 方案二:建造者模式,將女生和化妝師化妝進行了解耦合,並且易擴充套件,更換化妝師也很方便;並且有一個化妝總設計師作為指揮者的角色,可以方便的控制化妝的順序,符合開閉原則

總結

建造者模式的優勢:

將產品本身與產品的建立過程解耦合

擴充套件性很高,很方便的增加或者替換具體建造者

方便用程式來控制產品的建立過程以及順序

指揮者類針對抽象建造者程式設計,系統擴充套件方便,符合開閉原則

注意點

建造者模式建立的產品一般組成部分類似,如果產品差異性非常大,不適合了,合理利用

如果產品內部變化複雜,導致系統非常龐大,權衡

到此這篇關於Java設計模式之建造者模式的範例詳解的文章就介紹到這了,更多相關Java建造者模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com