Java開發中常用的設計模式(三)---建造者模式


一. 模式結構

  建造者模式主要包含四個角色: 

Product:產品角色。

Builder:抽象建造者。它聲明為創建一個Product對象的各個部件指定的抽象接口。

ConcreteBuilder:具體建造者。實現抽象接口,構建和裝配各個部件。

Director:指揮者。構建一個使用Builder接口的對象。它主要是用於創建一個復雜的對象,它主要有兩個作用,一是:隔離了客戶與對象的生產過程,二是:負責控制產品對象的生產過程。

 

二. 模式實現

    KFC里面一般都有好幾種可供客戶選擇的套餐,它可以根據客戶所點的套餐,然后在后面做這些套餐,返回給客戶的事一個完整的、美好的套餐。下面我們將會模擬這個過程,我們約定套餐主要包含漢堡、薯條、可樂、雞腿等等組成部分,使用不同的組成部分就可以構建出不同的套餐。

 

  1. Meal.java  套餐類,Product角色

public class Meal {
    private String food;
    private String drink;

    public String getFood() {
        return food;
    }

    public void setFood(String food) {
        this.food = food;
    }

    public String getDrink() {
        return drink;
    }

    public void setDrink(String drink) {
        this.drink = drink;
    }
}
View Code

  2. MealBuilder.java  套餐構造器,Builder角色

public abstract class MealBuilder {
    Meal meal = new Meal();
    
    public abstract void buildFood();
    
    public abstract void buildDrink();
    
    public Meal getMeal(){
        return meal;
    }
}
View Code

  3. 套餐A、套餐B  實現抽象套餐類,ConcreteBuilder角色

public class MealA extends MealBuilder{

    public void buildDrink() {
        meal.setDrink("一杯可樂");
    }

    public void buildFood() {
        meal.setFood("一盒薯條");
    }

}


public class MealB extends MealBuilder{

    public void buildDrink() {
        meal.setDrink("一杯檸檬果汁");
    }

    public void buildFood() {
        meal.setFood("三個雞翅");
    }

}
View Code

  4. KFC的服務員  它決定了套餐是的實現過程,然后給你一個完美的套餐,Director角色

public class KFCWaiter {
    private MealBuilder mealBuilder;
    
    public void setMealBuilder(MealBuilder mealBuilder) {
        this.mealBuilder = mealBuilder;
    }

    public Meal construct(){
        //准備食物
        mealBuilder.buildFood();
        //准備飲料
        mealBuilder.buildDrink();
        
        //准備完畢,返回一個完整的套餐給客戶
        return mealBuilder.getMeal();
    }
}
View Code

  

三. 測試 

public class Client {
    public static void main(String[] args) {
        //服務員
        KFCWaiter waiter = new KFCWaiter();
        //套餐A
        MealA a = new MealA();
        //服務員准備套餐A
        waiter.setMealBuilder(a);
        //獲得套餐
        Meal mealA = waiter.construct();
        
        System.out.print("套餐A的組成部分:");
        System.out.println(mealA.getFood()+"---"+mealA.getDrink());
    }
}
View Code

  運行結果:套餐A的組成部分:一盒薯條---一杯可樂

 

四. 模式總結

    1. 建造者模式是將一個復雜對象的創建過程給封裝起來,客戶只需要知道可以利用對象名或者類型就能夠得到一個完整的對象實例,而不需要關心對象的具體創建過程。
    2. 建造者模式將對象的創建過程與對象本身隔離開了,使得細節依賴於抽象,符合依賴倒置原則。可以使用相同的創建過程來創建不同的產品對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM