Design Pattern: Builder 模式

來源:互聯網
上載者:User

http://www.35java.com/zhibo/forum.php?mod=viewthread&tid=264&extra=page%3D2

您想要建立一個迷宮產生程式,迷宮使用二維陣列來定義,0表示道路,1表示牆,2表示寶物,根據所定義的二維迷宮陣列,您想要程式自動產生各種不同材質的迷宮,例如磚牆迷宮,鑽石迷宮等等。

您可以在程式中定義兩個角色,一個是指導迷宮建立的Director角色,一個是按照指導者指示建立迷宮的Builder角色,Director根據定義的迷宮陣列來指導Builder,只要更換Builder,就可以完成不同材質的迷宮。

可以使用下面的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.length; j++) {
                // 由於mazeBuilder是IMazeBuilder型態
                // 所以無論Builder執行個體為何,這邊的程式都無需變動
                switch (maze[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();
    }   
}  

使用下面的程式來測試一下,它將產生兩個迷宮圖形:
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的原因。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.