Design Pattern: Builder 模式

  学习是分享和合作式的!

转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/9248365; 

文章摘自: http://www.riabook.cn/doc/designpattern/; 

您想要建立一个迷宫产生程式,迷宫使用二维阵列来定义,0表示道路,1表示墙,2表示宝物,根据所定义的二维迷宫阵列,您想要程式自动产生各种不同材质的迷宫,例如砖墙迷宫,钻石迷宫等等。
您可以在程式中定义两个角色,一个是指导迷宫建立的Director角色,一个是按照指导者指示建立迷宫的Builder角色,Director根据定义的迷宫阵列来指导Builder,只要更换Builder,就可以完成不同材质的迷宫。
可以使用下面的UML 类别图来表示上述的概念:

实际上的程式设计如下:

  • MazeDirector.java
   1: public class MazeDirector {
   2:     private int[][] maze;
   3:     private IMazeBuilder mazeBuilder;
   4:  
   5:     public void setMaze(int[][] maze) {
   6:         this.maze = maze;
   7:     }
   8:     
   9:     public void setMazeBuilder(IMazeBuilder mazeBuilder) {
  10:         this.mazeBuilder = mazeBuilder;
  11:     }
  12:     
  13:     public void buildMaze() {
  14:         for(int i = 0; i < maze.length; i++) {
  15:             for(int j = 0; j < maze[i].length; j++) {
  16:                 // 由于mazeBuilder是IMazeBuilder型态
  17:                 // 所以无论Builder实例为何,这边的程式都无需变动
  18:                switch (maze[i][j]) {
  19:                     case 0:
  20:                         mazeBuilder.createRoadBlock();
  21:                         break;
  22:                     case 1:
  23:                         mazeBuilder.createWallBlock();
  24:                         break;
  25:                     case 2:
  26:                         mazeBuilder.createTreasureBlock();
  27:                         break;
  28:                     default:
  29:                         System.out.println("undefined");
  30:                 }
  31:             }
  32:             mazeBuilder.nextRow();    
  33:         }
  34:     }
  35: } 
  • IMazeBuilder.java
   1: public interface IMazeBuilder {
   2:     public void createRoadBlock();
   3:     public void createWallBlock();
   4:     public void createTreasureBlock();
   5:     public void nextRow();
   6: } 
  • SoliderMazeBuilder.java

   1: public class SolidMazeBuilder implements IMazeBuilder {
   2:     public void createWallBlock() {
   3:         System.out.print("█");
   4:     }
   5:     
   6:     public void createRoadBlock() {
   7:         System.out.print(" ");
   8:     }
   9:     
  10:     public void createTreasureBlock() {
  11:         System.out.print("$ ");
  12:     }
  13:     
  14:     public void nextRow() {
  15:         System.out.println();
  16:     }
  17: }
  • DiamondMazeBuilder.java
   1: public class DiamondMazeBuilder implements IMazeBuilder {
   2:     public void createWallBlock() {
   3:         System.out.print("◇");
   4:     }
   5:     
   6:     public void createRoadBlock() {
   7:         System.out.print(" ");
   8:     }
   9:     
  10:     public void createTreasureBlock() {
  11:         System.out.print("* ");
  12:     }
  13:     
  14:     public void nextRow() {
  15:         System.out.println();
  16:     }    
  17: }  

使用下面的程式来测试一下,它将产生两个迷宫图形:

   1: public class Main {
   2:     public static void main(String[] args) {
   3:         int[][] maze = {{1, 1, 1, 1, 1, 1, 1}, 
   4:                         {1, 0, 0, 0, 0, 2, 1}, 
   5:                         {1, 0, 1, 0, 1, 0, 1}, 
   6:                         {1, 0, 2, 1, 0, 1, 1}, 
   7:                         {1, 1, 0, 1, 0, 1, 1}, 
   8:                         {1, 0, 0, 2, 0, 0, 1}, 
   9:                         {1, 1, 1, 1, 1, 1, 1}};
  10:         
  11:         MazeDirector mazeDirector = new MazeDirector();
  12:         mazeDirector.setMaze(maze);
  13:         
  14:         System.out.println("Build SolidMaze....");
  15:         mazeDirector.setMazeBuilder(new SolidMazeBuilder());
  16:         mazeDirector.buildMaze();
  17:         
  18:         System.out.println("Build DiamondMaze....");
  19:         
  20:         mazeDirector.setMazeBuilder(
  21:                        new DiamondMazeBuilder());
  22:         mazeDirector.buildMaze();
  23:     }
  24: } 

在迷宫例子中并没有产生或返回产品物件,这视您的需求而定,迷宫例子只是将结果输出至主控台,您也可以设计一个产品物件,或是将结果直接输出为文件。
在 Gof (Design Patterns Elements of Reusable Object-Oriented Software)中有给出了一个不错的例子,以设计文件剖析器为例,该剖析器可以将文件转换为其它的格式,以DOC文件剖析器为例好了,假设希望析剖器可以将DOC文件转换为RTF或是PDF文件,可以如下设计结构:

简单来说,建筑者模式适用的场合,在于使得您可以依赖抽象的建筑蓝图,而实际建造时可以使用不同的实例,这是其之所以命为Builder的原因

Edit by Atlas

Time 2013/7/4 14:23

时间: 2024-09-14 18:53:41

Design Pattern: Builder 模式的相关文章

Design Pattern: Prototype 模式

  学习是分享和合作式的! 转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/9271773: 文章摘自: http://www.riabook.cn/doc/designpattern/: 您从图书馆的期刊从发现了几篇您感兴趣的文章,由于这是图书馆的书,您不可以直接在书中作记号或写字,所以您将当中您所感兴趣的几个主题影印出来,这下子您就可在影印的文章上画记重点. Prototype模式的作用有些类似上面的描述,您在父类别中定义一个clo

Design Pattern: Proxy 模式

学习是分享和合作式的! 转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/10472999: 文章摘自: http://www.riabook.cn/doc/designpattern/: 在 Gof 的书中对Proxy模式的目的给定为:为其它的物件提供一种代理,以控制对这个物件的访问.由这句话所延伸出来的意思是,根据您的目的不同,您的代理物件将负有不同的责任,因为产生多种不同的代理情况. 根据不同的代理目的,而有不同的代理情况,在Gof

Design Pattern: Adapter 模式 - Object Adapter

您的电脑是个旧电脑,新的滑鼠都在使用USB接口了,而您的电脑上并没有USB,而只有一个PS2接口,这时您可以使用一个USB转PS2的接头作为转换,这样您的电脑就可以使用新滑鼠了(当然您也可以使用USB扩充卡,意思是相同的).  类似的概念,有时候您想在原来的程式中加入一个外部元件,例如一个类别,但是这个类别与您目前所设计的程式在介面上并不一致,为了让这个外部类与原程式的介面一致,您必须使用一个类别作为中介来配接它们,这时您可以采用Adapter模式.  举个例子来说,在Java 1.0中有个En

Design Pattern: Singleton 模式

一句话概括:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance).  很多时候,您会需要Singleton模式,例如印表机管理,您希望程式中只能有一个Print Spooler,以避免两个列印动作同时输入至印表机中:例如资料库管理,因为建立连接(Connection)物件会耗用资源,您希望程式中只能有一个 连接物件,所有其它的程式都透过这个物件来连接资料库,以避免连接物件

Design Pattern: Adapter 模式 - Class Adapter

Adapter模式的另一种作法是Class Adapter模式,在这个模式下,Adapter直接继承Adaptee(要引进的新类别),以拥有当中的成员及方法,在C++中的话可以这么作: C++中可以多重继承,但在Java中不行,所以在Java中若要采用Class Adapter,必须作点修改,一方面继承Adaptee,一方面实作Target的介面: 代码的实现是这样的: public class Adapter extends Adaptee implements Target {      /

Design Pattern: Flyweight 模式

学习是分享和合作式的! 转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/10472999: 文章摘自: http://www.riabook.cn/doc/designpattern/: 在 Gof 的书中指出,Flyweight的目的在于运用共享技术,使得一些细粒度的物件可以共享. Flyweight在牛津字典中的解释是"boxer of the lightest class".意思是特轻量级拳击手?其实应该是取"

Design Pattern: Strategy 模式

  学习是分享和合作式的! 转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/9306775: 文章摘自: http://www.riabook.cn/doc/designpattern/: 考虑您要设计一个更换各种符号的工具类TextCharChange,您是否会采用这样的方式: 1: public void replace() { 2: switch(getChangeType()) { 3: case RN_TYPE: 4: rep

Design Pattern: Composite 模式

  学习是分享和合作式的! 转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/9417163: 文章摘自: http://www.riabook.cn/doc/designpattern/: 如果以绘图为例的话,一个文字是一个绘图元件,一个线段是一个绘图元件,而一个长方形也是一个绘图元件,这些绘图元件可以组成一个图片,如果将这个图片也 视作一个绘图元件,则这么递回绘图下去,就可以组合成一个较大的.复杂的图形元件,这样的目的可以使用Comp

Design Pattern: Facade 模式

  学习是分享和合作式的! 转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/10472943: 文章摘自: http://www.riabook.cn/doc/designpattern/: 考虑要撰写一个Web Mail程式,手上已经有一些已经开发好的元件(Component),像是开发Web Mail所需要的SMTP处理类.允许上传附档的FileUpload类,以及Web安全相关的API.其它相关的Package等等. 当拿到一些现