?? builderpattern.htm
字號:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>Builder 模式</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="CppGossip.html">Design Pattern: Builder 模式</a></h1>
您想要建立一個迷宮產(chǎn)生程式,迷宮使用二維陣列來定義,0表示道路,1表示墻,2表示寶物,根據(jù)所定義的二維迷宮陣列,您想要程式自動產(chǎn)生各種不同材質(zhì)的迷宮,例如磚墻迷宮,鉆石迷宮等等。<br>
<br>
您可以在程式中定義兩個角色,一個是指導迷宮建立的Director角色,一個是按照指導者指示建立迷宮的Builder角色,Director根據(jù)定義的迷宮陣列來指導Builder,只要更換Builder,就可以完成不同材質(zhì)的迷宮。<br>
<br>
可以使用下面的UML 類別圖來表示上述的概念:<br>
<div style="text-align: center;"><img style="width: 530px; height: 515px;" alt="Builder" title="Builder" src="images/builder-1.jpg"><br>
</div>
實際上的程式設計如下:<br>
<ul>
<li> MazeDirector.java </li>
</ul>
<pre>public class MazeDirector {<br> private int[][] maze;<br> private IMazeBuilder mazeBuilder;<br><br> public void setMaze(int[][] maze) {<br> this.maze = maze;<br> }<br> <br> public void setMazeBuilder(IMazeBuilder mazeBuilder) {<br> this.mazeBuilder = mazeBuilder;<br> }<br> <br> public void buildMaze() {<br> for(int i = 0; i < maze.length; i++) {<br> for(int j = 0; j < maze[i].length; j++) {<br> // 由于mazeBuilder是IMazeBuilder型態(tài)<br> // 所以無論Builder實例為何,這邊的程式都無需變動<br> switch (maze[i][j]) {<br> case 0:<br> mazeBuilder.createRoadBlock();<br> break;<br> case 1:<br> mazeBuilder.createWallBlock();<br> break;<br> case 2:<br> mazeBuilder.createTreasureBlock();<br> break;<br> default:<br> System.out.println("undefined");<br> }<br> }<br> mazeBuilder.nextRow(); <br> }<br> }<br>} <br></pre>
<br>
<ul>
<li> IMazeBuilder.java </li>
</ul>
<pre>public interface IMazeBuilder {<br> public void createRoadBlock();<br> public void createWallBlock();<br> public void createTreasureBlock();<br> public void nextRow();<br>} <br></pre>
<br>
<ul>
<li> SoliderMazeBuilder.java </li>
</ul>
<pre>public class SolidMazeBuilder implements IMazeBuilder {<br> public void createWallBlock() {<br> System.out.print("█");<br> }<br> <br> public void createRoadBlock() {<br> System.out.print(" ");<br> }<br> <br> public void createTreasureBlock() {<br> System.out.print("$ ");<br> }<br> <br> public void nextRow() {<br> System.out.println();<br> }<br>} <br></pre>
<br>
<ul>
<li> DiamondMazeBuilder.java </li>
</ul>
<pre>public class DiamondMazeBuilder implements IMazeBuilder {<br> public void createWallBlock() {<br> System.out.print("◇");<br> }<br> <br> public void createRoadBlock() {<br> System.out.print(" ");<br> }<br> <br> public void createTreasureBlock() {<br> System.out.print("* ");<br> }<br> <br> public void nextRow() {<br> System.out.println();<br> } <br>} <br></pre>
<br>
使用下面的程式來測試一下,它將產(chǎn)生兩個迷宮圖形:<br>
<pre>public class Main {<br> public static void main(String[] args) {<br> int[][] maze = {{1, 1, 1, 1, 1, 1, 1}, <br> {1, 0, 0, 0, 0, 2, 1}, <br> {1, 0, 1, 0, 1, 0, 1}, <br> {1, 0, 2, 1, 0, 1, 1}, <br> {1, 1, 0, 1, 0, 1, 1}, <br> {1, 0, 0, 2, 0, 0, 1}, <br> {1, 1, 1, 1, 1, 1, 1}};<br> <br> MazeDirector mazeDirector = new MazeDirector();<br> mazeDirector.setMaze(maze);<br> <br> System.out.println("Build SolidMaze....");<br> mazeDirector.setMazeBuilder(new SolidMazeBuilder());<br> mazeDirector.buildMaze();<br> <br> System.out.println("Build DiamondMaze....");<br> <br> mazeDirector.setMazeBuilder(<br> new DiamondMazeBuilder());<br> mazeDirector.buildMaze();<br> }<br>} </pre>
<br>
<div style="text-align: center;"><img style="width: 492px; height: 181px;" alt="Builder" title="Builder" src="images/builder-2.jpg"><br>
</div>
<br>
在迷宮例子中并沒有產(chǎn)生或返回產(chǎn)品物件,這視您的需求而定,迷宮例子只是將結果輸出至主控臺,您也可以設計一個產(chǎn)品物件,或是將結果直接輸出為文件。<br>
<br>
在<a href="GoF.htm"> Gof </a>中有給出了一個不錯的例子,以設計文件剖析器為例,該剖析器可以將文件轉(zhuǎn)換為其它的格式,以DOC文件剖析器為例好了,假設希望析剖器可以將DOC文件轉(zhuǎn)換為RTF或是PDF文件,可以如下設計結構:<br>
<div style="text-align: center;"><img style="width: 482px; height: 256px;" alt="Builder" title="Builder" src="images/builder-3.jpg"><br>
</div>
<br>
簡單來說,建筑者模式適用的場合,在于使得您可以依賴抽象的建筑藍圖,而實際建造時可以使用不同的實例,這是其之所以命為Builder的原因。<br>
<br>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -