⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 builderpattern.htm

📁 DesignPattern基于Java方面最好的书
💻 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>


您想要建立一个迷宫产生程式,迷宫使用二维阵列来定义,0表示道路,1表示墙,2表示宝物,根据所定义的二维迷宫阵列,您想要程式自动产生各种不同材质的迷宫,例如砖墙迷宫,钻石迷宫等等。<br>
<br>
您可以在程式中定义两个角色,一个是指导迷宫建立的Director角色,一个是按照指导者指示建立迷宫的Builder角色,Director根据定义的迷宫阵列来指导Builder,只要更换Builder,就可以完成不同材质的迷宫。<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 &lt; maze.length; i++) {<br>            for(int j = 0; j &lt; maze[i].length; j++) {<br>                // 由于mazeBuilder是IMazeBuilder型态<br>                // 所以无论Builder实例为何,这边的程式都无需变动<br>               &nbsp;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>
使用下面的程式来测试一下,它将产生两个迷宫图形:<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>
在迷宫例子中并没有产生或返回产品物件,这视您的需求而定,迷宫例子只是将结果输出至主控台,您也可以设计一个产品物件,或是将结果直接输出为文件。<br>
<br>
在<a href="GoF.htm"> Gof </a>中有给出了一个不错的例子,以设计文件剖析器为例,该剖析器可以将文件转换为其它的格式,以DOC文件剖析器为例好了,假设希望析剖器可以将DOC文件转换为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 + -