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