Design Pattern: Builder 模式
學習是分享和合作式的!
轉載請注明出處:https://blog.csdn.net/wdzxl198/article/details/9248365;
文章摘自: https://www.riabook.cn/doc/designpattern/;
您想要建立一個迷宮產生程式,迷宮使用二維陣列來定義,0表示道路,1表示牆,2表示寶物,根據所定義的二維迷宮陣列,您想要程式自動產生各種不同材質的迷宮,例如磚牆迷宮,鑽石迷宮等等。
您可以在程式中定義兩個角色,一個是指導迷宮建立的Director角色,一個是按照指導者指示建立迷宮的Builder角色,Director根據定義的迷宮陣列來指導Builder,隻要更換Builder,就可以完成不同材質的迷宮。
可以使用下麵的UML 類別圖來表示上述的概念:
實際上的程式設計如下:
- 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: }
在迷宮例子中並沒有產生或返回產品物件,這視您的需求而定,迷宮例子隻是將結果輸出至主控台,您也可以設計一個產品物件,或是將結果直接輸出為文件。
在 Gof (Design Patterns Elements of Reusable Object-Oriented Software)中有給出了一個不錯的例子,以設計文件剖析器為例,該剖析器可以將文件轉換為其它的格式,以DOC文件剖析器為例好了,假設希望析剖器可以將DOC文件轉換為RTF或是PDF文件,可以如下設計結構:
簡單來說,建築者模式適用的場合,在於使得您可以依賴抽象的建築藍圖,而實際建造時可以使用不同的實例,這是其之所以命為Builder的原因
Edit by Atlas
Time 2013/7/4 14:23
最後更新:2017-04-03 16:48:30