Design Pattern: Builder 模式

  學習是分享和合作式的!

轉載請註明出處:http://blog.csdn.net/wdzxl198/article/details/9248365; 

文章摘自: http://www.riabook.cn/doc/designpattern/; 

您想要建立一個迷宮產生程式,迷宮使用二維陣列來定義,0表示道路,1表示牆,2表示寶物,根據所定義的二維迷宮陣列,您想要程式自動產生各種不同材質的迷宮,例如磚牆迷宮,鑽石迷宮等等。
您可以在程式中定義兩個角色,一個是指導迷宮建立的Director角色,一個是按照指導者指示建立迷宮的Builder角色,Director根據定義的迷宮陣列來指導Builder,只要更換Builder,就可以完成不同材質的迷宮。
可以使用下面的UML 類別圖來表示上述的概念:

Builder

實際上的程式設計如下:

  • MazeDirector.java
   1: public class MazeDirector {
   2:     private int[][] maze;
   3:     private IMazeBuilder mazeBuilder;
   4:  
   5:     public void setMaze(int[][] maze) {
   6:         this.maze = maze;
   7:     }
   8:     
   9:     public void setMazeBuilder(IMazeBuilder mazeBuilder) {
  10:         this.mazeBuilder = mazeBuilder;
  11:     }
  12:     
  13:     public void buildMaze() {
  14:         for(int i = 0; i < maze.length; i++) {
  15:             for(int j = 0; j < maze[i].length; j++) {
  16:                 // 由於mazeBuilder是IMazeBuilder型態
  17:                 // 所以無論Builder實例爲何,這邊的程式都無需變動
  18:                switch (maze[i][j]) {
  19:                     case 0:
  20:                         mazeBuilder.createRoadBlock();
  21:                         break;
  22:                     case 1:
  23:                         mazeBuilder.createWallBlock();
  24:                         break;
  25:                     case 2:
  26:                         mazeBuilder.createTreasureBlock();
  27:                         break;
  28:                     default:
  29:                         System.out.println("undefined");
  30:                 }
  31:             }
  32:             mazeBuilder.nextRow();    
  33:         }
  34:     }
  35: } 
  • IMazeBuilder.java
   1: public interface IMazeBuilder {
   2:     public void createRoadBlock();
   3:     public void createWallBlock();
   4:     public void createTreasureBlock();
   5:     public void nextRow();
   6: } 
  • SoliderMazeBuilder.java
   1: public class SolidMazeBuilder implements IMazeBuilder {
   2:     public void createWallBlock() {
   3:         System.out.print("█");
   4:     }
   5:     
   6:     public void createRoadBlock() {
   7:         System.out.print(" ");
   8:     }
   9:     
  10:     public void createTreasureBlock() {
  11:         System.out.print("$ ");
  12:     }
  13:     
  14:     public void nextRow() {
  15:         System.out.println();
  16:     }
  17: }

  • DiamondMazeBuilder.java
   1: public class DiamondMazeBuilder implements IMazeBuilder {
   2:     public void createWallBlock() {
   3:         System.out.print("◇");
   4:     }
   5:     
   6:     public void createRoadBlock() {
   7:         System.out.print(" ");
   8:     }
   9:     
  10:     public void createTreasureBlock() {
  11:         System.out.print("* ");
  12:     }
  13:     
  14:     public void nextRow() {
  15:         System.out.println();
  16:     }    
  17: }  

使用下面的程式來測試一下,它將產生兩個迷宮圖形:
   1: public class Main {
   2:     public static void main(String[] args) {
   3:         int[][] maze = {{1, 1, 1, 1, 1, 1, 1}, 
   4:                         {1, 0, 0, 0, 0, 2, 1}, 
   5:                         {1, 0, 1, 0, 1, 0, 1}, 
   6:                         {1, 0, 2, 1, 0, 1, 1}, 
   7:                         {1, 1, 0, 1, 0, 1, 1}, 
   8:                         {1, 0, 0, 2, 0, 0, 1}, 
   9:                         {1, 1, 1, 1, 1, 1, 1}};
  10:         
  11:         MazeDirector mazeDirector = new MazeDirector();
  12:         mazeDirector.setMaze(maze);
  13:         
  14:         System.out.println("Build SolidMaze....");
  15:         mazeDirector.setMazeBuilder(new SolidMazeBuilder());
  16:         mazeDirector.buildMaze();
  17:         
  18:         System.out.println("Build DiamondMaze....");
  19:         
  20:         mazeDirector.setMazeBuilder(
  21:                        new DiamondMazeBuilder());
  22:         mazeDirector.buildMaze();
  23:     }
  24: } 

Builder

在迷宮例子中並沒有產生或返回產品物件,這視您的需求而定,迷宮例子只是將結果輸出至主控臺,您也可以設計一個產品物件,或是將結果直接輸出爲文件。
在 Gof (Design Patterns Elements of Reusable Object-Oriented Software)中有給出了一個不錯的例子,以設計文件剖析器爲例,該剖析器可以將文件轉換爲其它的格式,以DOC文件剖析器爲例好了,假設希望析剖器可以將DOC文件轉換爲RTF或是PDF文件,可以如下設計結構:

Builder

簡單來說,建築者模式適用的場合,在於使得您可以依賴抽象的建築藍圖,而實際建造時可以使用不同的實例,這是其之所以命爲Builder的原因

Edit by Atlas

Time 2013/7/4 14:23

發佈了80 篇原創文章 · 獲贊 55 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章