[设计模式笔记]一. 创建型模式--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模式在创建复杂对象并同时返回, 一步到位).
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮