[设计模式笔记]一. 创建型模式--4.Builder模式(一)

2019-04-14 20:05发布

Builder模式

一. 意图


将一个复杂对象的构建于它的表示分离使得同样的构建过程可以创建不同表示.

二. 适用性


2.1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时; 2.2 当构造过程必须允许被构造的对象有不同的表示时;

三. 模式结构


图1

四. 角 {MOD}说明


Director : 构造一个使用Builder接口的对象Product的构建实现过程在Director中实现. Builer: 为创建一个Product对象的各个部件指定抽象接口. ConcreteBuilder: 实现Builder的接口以构造和装配该产品的各个部件 定义并明确它所创建的表示; 提供一个检索产品的接口.(例如:GetProduct1(), GetProduct2()); Product1, Product2: 表示被构造的复杂对象.

五. 使用

图2 // 伪代码 ConcreteBuilder1* pConcreteBuilder1 = new ConcreteBuilder1(); Director* pDirector = new Director(pConcreteBuilder1); pDirector->Construct(); Product1* pProduct1 = pConcreteBuilder1->GetProcut1(); // Director::Construct() { pBuilder->BuilderPart1(); pBuilder->BuilderPart2(); pBuilder->BuilderPart4(); pBuilder->BuilderPart3(); }


六. 说明


6.1 为什么Product没有抽象类适合Builder模式的情况中强调的是复杂对象通用个构造过程而这些复杂对象的表示或者属性可能是千差万别的所以可以不适用抽象Product当然在某种情况下复杂对象的构造过程一致属性也很一致时也是可以使用抽象Product因为有一个设计原则就是对接口编程如果可以把一类东西设计成接口那当然好了. 6.2 Builder中缺省方法为空设计成空的缺省方法也好设计成纯虚函数也好我觉得适合就好设计成缺省的空方法例如某些ConcreteBuilder是不需要BuilderPart2()那么它就可以不需要去实现直接集成Builder即可了如果此时Builder中的方法都是纯虚函数的话那么ConcreteBuilder就需要硬生生的实现一个空的BuilderPart2()我觉得适合就好Builder模式中可能是在Builder中实现缺省的空方法比较好因为很多Product的表示(属性)差别是比较大的只是构造过程比较一致而已(但也不是完全一致是设计成尽量一致而已.)

我的理解


7.1 抓住Builder模式与Abstact Factory模式的区别是Builder同一个创建过程可以创建不同的表示Abstract Factory 模式是可以创建一系列相关或相互依赖的对象

八. 相关模式


Abstract Factory模式与Builder模式相似因为它也是可以创建复杂对象 区别是Builder模式着重复杂对象的共同创建过程(相同的创建流程). Builder模式生成的产品对象的组成可能差别很大的. (因为产品对象甚至不需要抽象Product). Abstract Factory模式着重系列的复杂对象的组成(这些复杂对象的组成很相似以至于可以使用通用的创建接口). Builder模式在最后的一步返回产品而对于Abstract Factory模式产品是立刻返回的(工厂模式的都是立刻返回).(也可以这样理解:Builder模式创建复杂对象是先执行创建流程在返回产品Abstract Factory模式在创建复杂对象并同时返回一步到位).