实现
2) 为什么产品没有抽象类
通常情况下,由具体生成器生成的产品,它们的表示相差是如此之大以至于给不同的产品以公共父类没有太大意思。在 RTF例子中,ASCIITe xt和TextWidget对象不太可能有公共接口,它们也不需要这样的接口。因为客户通常用合适的具体生成器来配置导向者,客户处于的位置使它知道Builder的哪一个具体子类被使用和能相应的处理它的产品。
这一点和抽象工厂模式有很大的不同。抽象工厂模式虽然也同样通过不同的具象工厂生成不同的产品,但是这些产品都继承于同样的基类。因为只有这样,利用者才能将它们看成同样的产品来使用。而Builder模式侧重于构建产品的过程的抽象,并没有要求生成产品具有相同的特性,或者说Builder模式的目的之一恐怕就是生成完全不同的产品,以供不同的用户在完全不同的场景中使用。这种情况下即使声明了共同的基类恐怕也没有什么用。
上面的区别是学习设计模式中最重要的部分,也就是说设计模式是在一个什么样的上下文中使用,用以解决什么问题的。关于这一点作者称之为场景。
3 ) 在Builder中却省的方法为空
C++中,生成方法故意不声明为纯虚成员函数,而是把它们定义为空方法,这使客户只重定义他们所感兴趣的操作。
《设计模式》书中的译文出现了别字,应该是缺省的方法。是说Builder基类应该为每个操作定义一个没有任何实现的空函数。这个说法不够严密。这个空函数应该可以保证产品的构建过程能够正常进行,也就是说不能返回导致程序失败的返回值,或者发生内存泄漏等。严格讲应该是缺省实现,而不是空函数。
很遗憾,前面一篇文章中的例子使用了纯虚函数。
特此订正:这一点大师说的对。
作者观点
如果不能理解场景只看类图,那么看到的都是相似的类图。
注:
本文中
蓝 {MOD}粗体文字都引自《设计模式》一书。
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】