Aha!设计模式(9)-抽象工厂(8)

2019-04-13 13:53发布

代码示例   《设计模式》一书中关于代码示例的说明非常详细,这里不再重复原书中的内容。希望大家自己去读一遍原著,然后再来阅读本文的内容。   基本上每个设计模式的代码示例都会讲一个故事,但是故事并不是设计模式的重点,它只是希望大家相信真的存在需要这个模式的场景。重要的还是类关系和代码。   利用者代码:   这段代码中创建了一个Maze对象,两个Room对象和六个Wall对象,然后建立各个对象之间的联系。   工厂基类     和前面的例子中稍微有些区别的是,这里的MazeFactory并不是抽象类,自己有实现代码,也可以构建产品:     测试代码   实例中通过如下代码将MazeGame,MazeFactory联系在一起。   它的输出结果是:     派生工厂   接下来是派生工厂类,本例中一共有两个:EnchantedMazeFactory和BombedMazeFactory。工厂类的类图如下: 可以看到,两个派生类只是覆盖了基类的一部分操作,没有实现的部分继续沿用基类的功能。这是之前的例子中没有过的。   这两个派生工厂类的示例代码如下:   除了使用的工厂类不同以外,和test1完全相同。其输出结果如下:     抽象工厂也不一定抽象,重要的是领会精神。   设计模式之外   想要真正把设计模式运用到开发中,往往还需要处理好另外一些问题,例如内存管理。我们回头看看原书中的代码:     注意观察SetSide调用的部分。   第一次调用时接受了factory.MakeWall()构建的Wall对象,由于这个对象没有传递给其他的变量,所以wall对象的内存管理权限应该交给r1;第二次调用时传递的是aDoor对象,这个对象除了传递给r1以外,后面又传递给r2。这个aDoor的内存应该由谁来管理呢?   为了解决这个问题,需要重新考虑内存管理的策略。例如所有对象的内存都交给aMaze对象管理,其他对象之间都是参照关系。这样当然可以解决问题,但是比较繁琐也不够好玩,作者在这里采用了另外的策略:使用C++11中的shared_ptr来解决问题。   单从形式上看,作者的实现和《设计模式》示例代码有以下区别:  
  1. 所有的指针都被替换为自定义类型
  2. 创建对象是使用make_shared。
  这里的自定义类型就是智能指针,例如WallPtr的定义为:     所有的变化都是因为使用了shared_ptr。   这样操作的结果就是大大简化了内存管理。在作者提供的这个示例中,由于内存管理全部交给shared_ptr进行,不再需要显式释放内存。   具体可以文末的下载链接。   参考链接: 示例代码: https://github.com/xueweiguo/OOThinking/tree/master/Aha!DesignPattern/AbstractFactory/AbstractFactory   EA图: https://github.com/xueweiguo/OOThinking/blob/master/Aha!DesignPattern/Aha!DesignPattern.EAP  

智能指针shared_ptr(1)https://mp.weixin.qq.com/s/rreUOPpoNTvPWXLjgV_bsA

智能指针shared_ptr(2)

https://mp.weixin.qq.com/s/3J1_nZNrDs5X-rw_XUw9UQ  

智能指针shared_ptr(3)https://mp.weixin.qq.com/s/hURdinSkkw960qD5Wq1YOA

注:   本文中蓝 {MOD}粗体文字都引自《设计模式》一书。                          觉得本文有帮助?请分享给更多人。 阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】