精通Python设计模式(第2版)
上QQ阅读APP看书,第一时间看更新

第2章 建造者模式

前一章介绍了前两种创建型模式——工厂方法和抽象工厂。它们都提供了在重要情况下改进对象创建方法的途径。

现在,假设我们要创建一个由多个部分组成的对象,而且创建过程需要一步一步地完成。只有创建了所有部分,该对象才是完整的。这就是建造者设计模式可以帮助我们的地方。建造者模式将复杂对象的构建与其表示分离。通过将构建与表示分离,相同的构建结构可用于创建几个不同的表示(j.mp/builderpat)。

介绍一个实际的例子会有助于你理解建造者模式的目的。假设我们想创建一个HTML页面生成器。HTML页面的基础结构(构建部分)大同小异:以<html>开始,以</html>结束,在HTML部分中有<head>与</head>元素,在head部分中有<title>和</title>元素,以此类推。但是页面的表示可能不同。每个页面都有自己的标题、头部和不同的<body>内容。此外,页面通常按步骤构建:一个函数添加标题,一个函数添加主头部,一个函数添加脚注,等等。只有在页面的整个结构完成之后,才能使用一个最终的渲染函数将其呈现给客户端。我们可以进一步扩展HTML生成器,使其能够生成完全不同的HTML页面。一个页面可能包含表格,一个页面可能包含图像库,一个页面可能包含联系人表单,等等。

HTML页面生成问题可以使用建造者模式解决。这种模式中,主要有两个参与者。

建造者(builder):负责创建复杂对象的各个部分的组件。本例中,这些部分是页面的标题、头部、主体和脚注。

指挥者(director):使用建造者实例控制构建过程的组件。调用建造者的函数来设置标题、头部,等等。而且,使用不同的建造者实例能够创建不同的HTML页面,而不需要触及指挥者的任何代码。

本章将讨论:

❑ 现实生活中的例子

❑ 用例

❑ 实现