建造样式与抽象工厂样式的区别
读者可能已经注意到了,建造样式与抽象工厂样式非常相像,而两者又都是用来建构同时属于几个产品族的对象的样式。那么这两种样式有什么样的区别呢?抽象工厂样式的简略类别图如下所示。
在抽象工厂样式中,每一次工厂对象被呼叫时都会传回一个完整的产品对象,而使用端有可能会决定把这些产品组装成一个更大的和复杂的产品,也有可能不会。工厂对象是没有状态的,不知道上一次构建的是哪一个产品,也没有未来的概念,不知道下一次构建的是哪一个产品,更不知道自己构建的产品在更高层的产品结构蓝图中是什么位置。
建造类别则不同,建造样式的重点在导演者角色。导演者对象是有状态的,它知道整体蓝图,知道上一次、这一次和下一次交给建造者角色去构建的零件是什么,以便能够将这些零件组装成为一个更大规模的产品。它一点一点地建造出一个复杂的产品,而这个产品的组装程序就发生在导演者角色内部。建造者样式的使用端拿到的是一个完整的最后产品。
换言之,虽然抽象工厂样式与建造样式都是设计样式,但是抽象工厂样式处在更加具体的尺度上,而建造样式则处于更加宏观的尺度上。一个系统可以由一个建造样式和一个抽象工厂样式组成,使用端通过呼叫这个导演角色,间接地呼叫另一个抽象工厂样式的工厂角色。工厂样式传回不同产品族的零件,而建造者样式则把它们组装起来。
比如仍以众神造人为例,女娲利用建造样式负责把灵魂、耳目、手臂等组合成一个完整的人,而黄帝、上骈、桑林各自利用工厂样式创造出灵魂、耳目、臂手等。女娲不必考虑灵魂、耳目、手臂是什么样子、怎么创造出来的,这就成为一个由建造样式和抽象工厂样式组合而成的系统。
本书认为建造样式这个名字不如改为导演样式更能反映出本样式的本质,也更容易与工厂样式区分。实际上,只要向简单工厂样式、工厂方法样式、抽象工厂样式(甚至原型样式)中加入一个通晓整体产品结构的导演者角色,就可以得到某种形式的建造样式---由导演者角色反复呼叫各个工厂对象进行零件建造,然后由导演者角色进行零件组装,形成最后产品。