Design Pattern: Builder 模式

简介:

原文:http://www.riabook.cn/doc/designpattern/BuilderPattern.htm

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


实际上的程式设计如下:

  • MazeDirector.java

public class MazeDirector {
    private int[][] maze;
    private IMazeBuilder mazeBuilder;

    public void setMaze(int[][] maze) {
        this.maze = maze;
    }
    
    public void setMazeBuilder(IMazeBuilder mazeBuilder) {
        this.mazeBuilder = mazeBuilder;
    }
    
    public void buildMaze() {
        for(int i = 0; i < maze.length; i++) {
            for(int j = 0; j < maze[i].length; j++) {
                // 由于mazeBuilder是IMazeBuilder型态
                // 所以无论Builder实例为何,这边的程式都无需变动
                switch (maze[i][j]) {
                    case 0:
                        mazeBuilder.createRoadBlock();
                        break;
                    case 1:
                        mazeBuilder.createWallBlock();
                        break;
                    case 2:
                        mazeBuilder.createTreasureBlock();
                        break;
                    default:
                        System.out.println("undefined");
                }
            }
            mazeBuilder.nextRow();    
        }
    }
} 

IMazeBuilder.java

public interface IMazeBuilder {
    public void createRoadBlock();
    public void createWallBlock();
    public void createTreasureBlock();
    public void nextRow();
} 

SoliderMazeBuilder.java

public class SolidMazeBuilder implements IMazeBuilder {
    public void createWallBlock() {
        System.out.print("█");
    }
    
    public void createRoadBlock() {
        System.out.print(" ");
    }
    
    public void createTreasureBlock() {
        System.out.print("$ ");
    }
    
    public void nextRow() {
        System.out.println();
    }
} 

DiamondMazeBuilder.java

public class DiamondMazeBuilder implements IMazeBuilder {
    public void createWallBlock() {
        System.out.print("◇");
    }
    
    public void createRoadBlock() {
        System.out.print(" ");
    }
    
    public void createTreasureBlock() {
        System.out.print("* ");
    }
    
    public void nextRow() {
        System.out.println();
    }    
}  

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

public class Main {
    public static void main(String[] args) {
        int[][] maze = {{1, 1, 1, 1, 1, 1, 1}, 
                        {1, 0, 0, 0, 0, 2, 1}, 
                        {1, 0, 1, 0, 1, 0, 1}, 
                        {1, 0, 2, 1, 0, 1, 1}, 
                        {1, 1, 0, 1, 0, 1, 1}, 
                        {1, 0, 0, 2, 0, 0, 1}, 
                        {1, 1, 1, 1, 1, 1, 1}};
        
        MazeDirector mazeDirector = new MazeDirector();
        mazeDirector.setMaze(maze);
        
        System.out.println("Build SolidMaze....");
        mazeDirector.setMazeBuilder(new SolidMazeBuilder());
        mazeDirector.buildMaze();
        
        System.out.println("Build DiamondMaze....");
        
        mazeDirector.setMazeBuilder(
                       new DiamondMazeBuilder());
        mazeDirector.buildMaze();
    }
} 


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

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

目录
相关文章
|
算法 PyTorch 计算机视觉
改进的yolov5目标检测-yolov5替换骨干网络-yolo剪枝(TensorRT及NCNN部署)-2
改进的yolov5目标检测-yolov5替换骨干网络-yolo剪枝(TensorRT及NCNN部署)-2
改进的yolov5目标检测-yolov5替换骨干网络-yolo剪枝(TensorRT及NCNN部署)-2
|
设计模式 存储 缓存
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用(二)
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用
262 0
|
存储 算法 搜索推荐
15一维数组
15一维数组
119 0
|
存储 Kubernetes 调度
了解pod和pod的生命周期-这一篇文章就够了
了解pod和pod的生命周期-这一篇文章就够了
了解pod和pod的生命周期-这一篇文章就够了
|
人工智能 关系型数据库 分布式数据库
DB+AI会擦出怎样的火花?一站式带你了解阿里云瑶池数据库经典的AI产品服务与实践!
从 DB+AI 精选解决方案、特惠权益等,一站式带你了解阿里云瑶池数据库经典的AI产品服务与实践。
|
安全 算法 搜索推荐
现代操作系统的设计与优化策略
本文深入探讨了现代操作系统在设计与优化方面的多种策略。通过分析系统架构、内核优化、用户界面设计以及安全性增强等关键方面,揭示了如何构建一个高效、稳定且安全的操作系统。同时,结合具体案例和实际应用场景,展示了这些策略在实践中的应用与成效。
252 1
|
消息中间件 开发工具 RocketMQ
消息队列 MQ产品使用合集之如何关闭客户端的日志记录
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
11月前
|
机器学习/深度学习 并行计算 PyTorch
探索PyTorch:张量的创建和数值计算
探索PyTorch:张量的创建和数值计算
|
存储 安全 Java
缓冲区溢出之堆溢出(Heap Overflow)
【8月更文挑战第18天】
647 3
|
存储
数据结构之栈
栈:栈是限定仅在表尾进行插入和删除操作的线性表。“栈”者,存储货物或供旅客住宿的地方,可引申为仓库、中转站,引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法
79 0