如果您有個物件必須建立,物件是由個別組件(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+"個"); } }; } }