|
您想要建立一個迷宮產生程式,迷宮使用二維陣列來定義,0表示道路,1表示牆,2表示寶物,根據所定義的二維迷宮陣列,您想要程式自動產生各種不同材質的迷宮,例如磚牆迷宮,鑽石迷宮等等。
您可以在程式中定義兩個角色,一個是指導迷宮建立的Director角色,一個是按照指導者指示建立迷宮的Builder角色,Director根據定義的迷宮陣列來指導Builder,只要更換Builder,就可以完成不同材質的迷宮。
可以使用下面的UML 類別圖來表示上述的概念:
實際上的程式設計如下:
public class MazeDirector { private int[][] maze; private IMazeBuilder mazeBuilder;
public void setMaze(int[][] maze) { this.maze = maze; } public void setMazeBuilder(IMazeBuilder mazeBuilder) { this.mazeBuilder = mazeBuilder; } public void buildMaze() { for(int i = 0; i < maze.length; i++) { for(int j = 0; j < maze[i].length; j++) { // 由於mazeBuilder是IMazeBuilder型態 // 所以無論Builder實例為何,這邊的程式都無需變動 switch (maze[i][j]) { case 0: mazeBuilder.createRoadBlock(); break; case 1: mazeBuilder.createWallBlock(); break; case 2: mazeBuilder.createTreasureBlock(); break; default: System.out.println("undefined"); } } mazeBuilder.nextRow(); } } }
public interface IMazeBuilder { public void createRoadBlock(); public void createWallBlock(); public void createTreasureBlock(); public void nextRow(); }
public class SolidMazeBuilder implements IMazeBuilder { public void createWallBlock() { System.out.print("█"); } public void createRoadBlock() { System.out.print(" "); } public void createTreasureBlock() { System.out.print("$ "); } public void nextRow() { System.out.println(); } }
public class DiamondMazeBuilder implements IMazeBuilder { public void createWallBlock() { System.out.print("◇"); } public void createRoadBlock() { System.out.print(" "); } public void createTreasureBlock() { System.out.print("* "); } public void nextRow() { System.out.println(); } }
使用下面的程式來測試一下,它將產生兩個迷宮圖形:
public class Main { public static void main(String[] args) { int[][] maze = {{1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 0, 2, 1}, {1, 0, 1, 0, 1, 0, 1}, {1, 0, 2, 1, 0, 1, 1}, {1, 1, 0, 1, 0, 1, 1}, {1, 0, 0, 2, 0, 0, 1}, {1, 1, 1, 1, 1, 1, 1}}; MazeDirector mazeDirector = new MazeDirector(); mazeDirector.setMaze(maze); System.out.println("Build SolidMaze...."); mazeDirector.setMazeBuilder(new SolidMazeBuilder()); mazeDirector.buildMaze(); System.out.println("Build DiamondMaze...."); mazeDirector.setMazeBuilder( new DiamondMazeBuilder()); mazeDirector.buildMaze(); } }
在迷宮例子中並沒有產生或返回產品物件,這視您的需求而定,迷宮例子只是將結果輸出至主控台,您也可以設計一個產品物件,或是將結果直接輸出為文件。
在 Gof 中有給出了一個不錯的例子,以設計文件剖析器為例,該剖析器可以將文件轉換為其它的格式,以DOC文件剖析器為例好了,假設希望析剖器可以將DOC文件轉換為RTF或是PDF文件,可以如下設計結構:
簡單來說,建築者模式適用的場合,在於使得您可以依賴抽象的建築藍圖,而實際建造時可以使用不同的實例,這是其之所以命為Builder的原因。
|