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

實(shí)際上的程式設(shè)計(jì)如下:
使用下面的程式來測(cè)試一下,它將產(chǎn)生兩個(gè)迷宮圖形:

在迷宮例子中並沒有產(chǎn)生或返回產(chǎn)品物件,這視您的需求而定,迷宮例子只是將結(jié)果輸出至主控臺(tái),您也可以設(shè)計(jì)一個(gè)產(chǎn)品物件,或是將結(jié)果直接輸出為文件。
在 Gof 中有給出了一個(gè)不錯(cuò)的例子,以設(shè)計(jì)文件剖析器為例,該剖析器可以將文件轉(zhuǎn)換為其它的格式,以DOC文件剖析器為例好了,假設(shè)希望析剖器可以將DOC文件轉(zhuǎn)換為RTF或是PDF文件,可以如下設(shè)計(jì)結(jié)構(gòu):

簡(jiǎn)單來說,建築者模式適用的場(chǎng)合,在於使得您可以依賴抽象的建築藍(lán)圖,而實(shí)際建造時(shí)可以使用不同的實(shí)例,這是其之所以命為Builder的原因.
您可以在程式中定義兩個(gè)角色,一個(gè)是指導(dǎo)迷宮建立的Director角色,一個(gè)是按照指導(dǎo)者指示建立迷宮的Builder角色,Director根據(jù)定義的迷宮陣列來指導(dǎo)Builder,只要更換Builder,就可以完成不同材質(zhì)的迷宮。
可以使用下面的UML 類別圖來表示上述的概念:

- MazeDirector.java
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型態(tài)
// 所以無論Builder實(shí)例為何,這邊的程式都無需變動(dòng)
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();
}
}
}
- IMazeBuilder.java
public interface IMazeBuilder {
public void createRoadBlock();
public void createWallBlock();
public void createTreasureBlock();
public void nextRow();
}
- SoliderMazeBuilder.java
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();
}
}
- DiamondMazeBuilder.java
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();
}
}
使用下面的程式來測(cè)試一下,它將產(chǎn)生兩個(gè)迷宮圖形:
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();
}
}

在迷宮例子中並沒有產(chǎn)生或返回產(chǎn)品物件,這視您的需求而定,迷宮例子只是將結(jié)果輸出至主控臺(tái),您也可以設(shè)計(jì)一個(gè)產(chǎn)品物件,或是將結(jié)果直接輸出為文件。
在 Gof 中有給出了一個(gè)不錯(cuò)的例子,以設(shè)計(jì)文件剖析器為例,該剖析器可以將文件轉(zhuǎn)換為其它的格式,以DOC文件剖析器為例好了,假設(shè)希望析剖器可以將DOC文件轉(zhuǎn)換為RTF或是PDF文件,可以如下設(shè)計(jì)結(jié)構(gòu):

簡(jiǎn)單來說,建築者模式適用的場(chǎng)合,在於使得您可以依賴抽象的建築藍(lán)圖,而實(shí)際建造時(shí)可以使用不同的實(shí)例,這是其之所以命為Builder的原因.