創建迷宮 - 生成器模式


 

如果您有個物件必須建立,物件是由個別組件(Component)組合而成,個別組件建立非常復雜,但說明如何運用組件建立非 常簡單,您希望將建立復雜組件與運用組件方式分離,則可以使用Builder模式。

例來說,您想要建立一個迷宮產生程序,迷宮使用二維陣列來定義,0表示道路,1表示牆,2表示寶物,根據所定義的二維迷宮陣列,您想要程序自動產生各種不 同材質的迷宮,例如磚牆迷宮,鑽石迷宮等。在不同的繪圖引擎下,建立各種材質非常復雜,但建立迷宮的表達方式很簡單,象是這邊要道牆,那邊要條路,旁邊要 放個寶藏之類的。

 

這時候可以使用建造者模式(Builder)

UML圖:

 

 

目錄結構:

 

 代碼:

package design_mode.builder;

/**
 * Created by Andrew on 2016/11/7.
 */
public interface Maze {
    void paint();
}

 

 

package design_mode.builder;

/**
 * Created by Andrew on 2016/11/7.
 */
public abstract class MazeBuilder {

    char [][] maze;

    MazeBuilder(char [][] maze){this.maze = maze;}

    public void buildWall(int i, int j){}

    public void buildRoom(int i, int j){}

    public void buildTreasure(int i, int j){}

    public abstract Maze getMaze();

}

 

package design_mode.builder;

/**
 * Created by Andrew on 2016/11/7.
 */
public class MazeDirector {

    char [][] maze;
    MazeBuilder builder;

    MazeDirector(char [][] maze, MazeBuilder builder){
        this.maze = maze;
        this.builder = builder;
    }

    public Maze construct(){
        for (int i = 0; i < maze.length; i++) {
            for (int j = 0; j < maze[i].length; j++) {
                switch (maze[i][j]){
                    case 0:
                        builder.buildWall(i,j);
                        break;
                    case 1:
                        builder.buildRoom(i, j);
                        break;
                    case 2:
                        builder.buildTreasure(i,j);
                        break;
                }
            }
        }
        return builder.getMaze();
    }


    public static void main(String[] args) {
        char[][] maze = new char[][]{
                {0,1,0,1,0},
                {0,1,2,1,0},
                {0,1,0,1,0}
        };
//        MazeDirector mazeDirector = new MazeDirector(maze,new PlainMazeBuilder(maze));
        MazeDirector mazeDirector = new MazeDirector(maze,new CountMazeBuilder(maze));
        Maze maze1= mazeDirector.construct();
        maze1.paint();
    }

}

 

 

package design_mode.builder;

/**
 * Created by Andrew on 2016/11/7.
 */
public class PlainMazeBuilder extends MazeBuilder {

    PlainMazeBuilder(char[][] maze) {
        super(maze);
    }

    @Override
    public void buildRoom(int i, int j) {
        maze[i][j] = '|';
    }

    @Override
    public void buildWall(int i, int j) {
        maze[i][j] = '□';
    }

    @Override
    public void buildTreasure(int i, int j) {
        maze[i][j] = '※';
    }

    @Override
    public Maze getMaze() {
        return new Maze() {
            @Override
            public void paint() {
                for (char[] row : maze){
                    for (char ele : row){
                        System.out.print(ele);
                    }
                    System.out.println();
                }
            }
        };
    }


}

 

package design_mode.builder;

/**
 * Created by Andrew on 2016/11/7.
 */
public class CountMazeBuilder extends MazeBuilder {

    int i;
    int j;
    int k;

    CountMazeBuilder(char[][] maze) {
        super(maze);
    }

    @Override
    public void buildTreasure(int i, int j) {
        this.i++;
    }

    @Override
    public void buildWall(int i, int j) {
        this.j++;
    }

    @Override
    public void buildRoom(int i, int j) {
        this.k++;
    }

    @Override
    public Maze getMaze() {
        return new Maze() {
            @Override
            public void paint() {
                System.out.println("當前迷宮物件:");
                System.out.println("寶藏:"+i+"個");
                System.out.println("牆壁:"+j+"面");
                System.out.println("房間:"+k+"個");
            }
        };
    }
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM