Design Pattern學習筆記 --- Builder(生成器)模式

Builder(生成器)模式屬於對象建立型模式;設計模式

㈠意圖:ide

  將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示.post

  --GOF設計模式.測試

㈡理解:ui

  一樣的構建過程:意即在構建複雜對象的時候,所建立這個複雜對象的過程是不變的;this

  好比:準備一個美味的菜餚;通常都須要通過如下三個過程;spa

  ①處理原材料(若是是青菜就須要處理一些爛葉子;葷菜就要殺生了.)設計

  ②加工處理(或炒,或煮,或蒸)對象

  ③加調料,完工.接口

  與它的表示相分離:意思是指將構建的過程從具體複雜對象中抽取出來;不和每一個具體地複雜對象相綁定.

   例如:作青菜時,只包含這三個步驟的具體實現;而並不包括;這三個步驟的前後順序.

㈢UML圖:

 

㈣參與者:

  ①Builder

   -- 指定了建立一個複雜對象中各個部件(部分)的抽象接口

  ②ConcreteBuilder

   -- 實現了Builder接口中構造各個部件的具體方法;

   -- 定義並明確它所建立的具體的對象是什麼(Product)

   -- 提供一個獲取最終生成複雜對象的接口方法(getResult).

  ③Direct(導向器)

    -- 構造一個使用Builder接口的對象;並組合這個對象的生成具體部件的方法;並最終通知Builder構建完最終的複雜對象.

  ④Product

    -- 最終的複雜對象.

㈤協做關係:

㈥代碼表示:

 

  
  
  
  
  1. /** 
  2.  * 產品 
  3.  */ 
  4. package com.skywares.designpattern.builder; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class FishFood { 
  11.     public FishFood() 
  12.     { 
  13.         System.out.println("fish food !!"); 
  14.     } 

 

  
  
  
  
  1. /** 
  2.  * Builder模式中的Builder角色; 
  3.  */ 
  4. package com.skywares.designpattern.builder; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public interface FoodBuilder 
  11.     void prepareFood(); 
  12.     void handleFood(); 
  13.     void postFood(); 
  14.     FishFood getFood(); 

 

  
  
  
  
  1. /** 
  2.  * Builder模式中的具體Builder角色 
  3.  */ 
  4. package com.skywares.designpattern.builder; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class FishFoodBuilder implements FoodBuilder { 
  11.  
  12. //  private FishFood fishFood; 
  13.      
  14.     @Override 
  15.     public void prepareFood() { 
  16.         System.out.println(" 太可憐了!!請保護動物 "); 
  17.     } 
  18.  
  19.     @Override 
  20.     public void handleFood() { 
  21.         System.out.println(" 清蒸嗎? "); 
  22.     } 
  23.  
  24.     @Override 
  25.     public void postFood() { 
  26.         System.out.println(" 傷口上撒鹽!? "); 
  27.     } 
  28.      
  29.     public FishFood getFood() 
  30.     { 
  31.         return new FishFood(); 
  32.     } 
  33.  

 

  
  
  
  
  1. /** 
  2.  * Director角色 
  3.  */ 
  4. package com.skywares.designpattern.builder; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class FoodDirector { 
  11.      
  12.     private FoodBuilder foodBuilder; 
  13.      
  14.     public FoodDirector(FoodBuilder foodBuilder) 
  15.     { 
  16.         this.foodBuilder = foodBuilder; 
  17.     } 
  18.      
  19.     public FishFood constructFood() 
  20.     { 
  21.         foodBuilder.prepareFood(); 
  22.         foodBuilder.handleFood(); 
  23.         foodBuilder.postFood(); 
  24.         return foodBuilder.getFood(); 
  25.     } 
  26.  

 

  
  
  
  
  1. /** 
  2.  * 測試類 
  3.  */ 
  4. package com.skywares.designpattern.builder; 
  5.  
  6. /** 
  7.  * @author hubert 
  8.  * 
  9.  */ 
  10. public class Client { 
  11.  
  12.     /** 
  13.      * @param args 
  14.      */ 
  15.     public static void main(String[] args) { 
  16.         FoodBuilder foodBuiler = new FishFoodBuilder(); 
  17.         FoodDirector foodDirector = new FoodDirector(foodBuiler); 
  18.         foodDirector.constructFood(); 
  19.     } 
  20.  

 後記:

  Builder模式和Template Method模式有點像;主要表如今建立對象或者方法處理的步驟的部分.

  可是:Template method屬於類行爲模式;它主要是封裝一些相同的類行爲,將一些不肯定的類行爲方式延遲到子類進行實現;

  而Builder模式屬性對象建立模式;它的主要做用是解決如何建立一個複雜對象的問題;並讓這個複雜對象建立的過程與其對應的每一個部件的建立過程進行解耦.

  給出的例子有點不恰當.若是是組裝一部汽車什麼的可能會更合適一點.

相關文章
相關標籤/搜索