A StringBuilder
与构建器模式相似,但是与该设计模式的GoF描述没有太多共享。设计模式的初衷是
将复杂对象的构造与其表示分开,以便同一构造过程可以创建不同的表示。
—来自Design Patterns,由Gamma,Helm,Johnson和Vlissides撰写。
(注意:“复杂”主要是指“由多个部分组成”,不一定是“复杂”或“困难”)
这里的“不同表示”是关键。例如,假设此构建过程:
interface ArticleBuilder {
void addTitle(String title);
void addParagraph(String paragraph);
}
void createArticle(ArticeBuilder articleBuilder) {
articleBuilder.addTitle("Is String Builder an application of ...");
articleBuilder.addParagraph("Is the Builder Pattern restricted...");
articleBuilder.addParagraph("The StringBuilder class ...");
}
我们可能会根据提供的具体实现而以a HtmlDocument
或a TexDocument
或a 结尾MarkdownDocument
:
class HtmlDocumentBuilder implements ArticleBuilder {
...
HtmlDocument getResult();
}
HtmlDocumentBuilder b = new HtmlDocumentBuilder();
createArticle(b);
HtmlDocument dom = b.getResult();
因此,Builder模式的中心点是多态。设计模式书将这种模式与抽象工厂进行了比较:
抽象工厂与生成器相似,因为它也可以构造复杂的对象。主要区别在于Builder模式专注于逐步构建复杂的对象。[…] Builder将产品退回作为最后一步,但是就抽象工厂而言,产品将立即退回。
—来自Design Patterns,由Gamma,Helm,Johnson和Vlissides撰写。
这个逐步的方面已经成为Builder模式的更流行的方面,因此通常来说,Builder模式的理解如下:
将对象的构造分为多个步骤。这使我们即使在不支持这些功能的语言中也可以使用命名参数或可选参数。
维基百科定义了这样的模式:
构建器模式是对象创建软件设计模式。与旨在实现多态性的抽象工厂模式和工厂方法模式不同,构建器模式的意图是为可伸缩构造函数反模式[需要引用]找到解决方案。[…]
构建器模式还有另一个好处。它可以用于包含平面数据(html代码,SQL查询,X.509证书...)的对象,也就是说,这些数据不容易编辑。此类数据无法逐步编辑,必须立即进行编辑。构造此类对象的最佳方法是使用构建器类。[需要引用]
—来自Wikipedia上的Builder Pattern,由各种贡献者提供。
因此,如我们所见,对该名称所指的是哪种模式并没有真正的共识,而且在某些方面,不同的定义甚至彼此矛盾(例如,关于多态性对建造者的相关性)。
StringBuilder
模式具有各种解释的唯一共同属性是,产品是逐步创建的,而不是一次性创建的。它不能完全理解GoF对设计模式的定义,但请注意,设计模式是可塑的概念,旨在促进交流。我将继续称其StringBuilder
为Builder模式的一个示例,尽管它是一个非典型的示例-Java中这种结构的主要原因是在不可变字符串存在的情况下进行了高性能连接,但并不是一些有趣的面向对象设计。