代码示例
《设计模式》中的示例代码因为不完整所以不能编译,而且还有内存泄漏。它真的就是一个示例。本文根据自己的理解将不足的补上,同时在使用智能指针消除内存泄漏的同时尽量小地变更原来的代码。
首先是接口:
![](data/attach/1904/r1es0ws4ody07iae20yfzgpc6hpfpkll.jpg)
《设计模式》书中将实现代码也写在同一个文件中,这里将它们分开:
![](data/attach/1904/cjvwqw5592zit5m9de37jioe63j31bm2.jpg)
这两种方式区别不大。
接下来是使用Builder的代码:
将这个CreateMaze版本与原来的相比,注意生成器是如何隐藏迷宫的内部表示的 — 即定义房间、门和墙壁的那些类 — 以及这些部件是如何组装成最终的迷宫的。有人可能猜测到有一些类是用来表示房间和门的,但没有迹象显示哪个类是用来表示墙壁的。这就使得改变一个迷宫的表示方式要容易一些,因为所有MazeBuilder的客户都不需要被改变。
所谓原来的版本指的是抽象工程中使用的代码:
![](https://img-blog.csdnimg.cn/20181210185933381.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NyYWZ0c21hbjE5NzA=,size_16,color_FFFFFF,t_70)
可以看到,这段代码中使用了各种各样的类。而Builder模式的代码中这些类一个也没有出现。它们都被Builder类封装起来了。
![](https://img-blog.csdnimg.cn/20181210190043645.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NyYWZ0c21hbjE5NzA=,size_16,color_FFFFFF,t_70)
可以在StandMazeBuilder代码中找到原来代码的影子。
这实际上就是重构。重构之后就可以通过实现其他的具象Builder类来做一些有趣的事情,比如示例中的CountingMazeBuilder可以对操作进行计数等等。
还有一点
需要注意的是,MazeBuilder通过使用房间号识别构建过程中的重要对象而不需要知道对象的类型。这也算是一种抽象。在运用Builder模式的过程中,这种手法在大多数情况下是必须的。
代码下载地址
上述代码可以从以下地址下载。
https://github.com/xueweiguo/OOThinking/tree/master/Aha!DesignPattern/Builder/MazeBuilder
作者观点
Builder模式中隐藏具体类的方法需要一定的想法和技巧。
面向对象的许多工作看起来也不过就是将代码移来移去,但是这种移动实现了重构,结果是得到了更好的程序结构。
这不是小事情。
注:
本文中
蓝 {MOD}粗体文字都引自《设计模式》一书。
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】