1. 在C++中,如果在类的构造函数中调用虚函数时,使用的是静态绑定。
2. 建造者模式让对象的表示与构建相分离。
一、简介
建造者模式是当创建复杂对象的流程应该独立与该对象的组成部分以及他们的装配方式时适用的模式。本模式使得同样的构建过程可以创建不同的对象。
1. 优点:
1)隔离了构建的步骤和具体的实现,为产品的具体实现提供了灵活度。
2)封装和抽象了每个步骤的实现,实现了依赖倒转原则。
3)封装了具体的步骤,减少了代码的冗余。
2. 缺点:
1)要求构建产品的步骤(算法)是不能剧烈变化的,最好是不变的,这样就影响了灵活度。
二、结构图
以下为一张经典的建造者模式的结构类图:
在图中,可以看到具体产品的建造顺序作为不变的部分,被封装在建造者的虚接口中,但是复杂多变的构建可以通过多态去处理。
三、示例
#ifndef Builder_h #define Builder_h class Car { public: Car(); virtual ~Car() {}; void addWheel(); void addBody(); void addEngine(); void drive(); }; class BaseBuilder { public: BaseBuilder(); virtual ~BaseBuilder(); virtual addCarWheel(); virtual addCarBody(); virtual addCarEngine(); virtual Car getCar(); private: }; class BMWCarBuilder : public BaseBuilder { public: BMWCarBuilder() : m_car(new Car) {}; virtual ~BMWCarBuilder() {}; virtual addCarWheel() { m_car->addWheel(); }; virtual addCarBody() { m_car->addBody(); }; virtual addCarEngine() { m_car->addEngine(); }; virtual Car getCar() { return (*m_car); }; private: Car *m_car; }; class QQCarBuilder : public BaseBuilder { public: QQCarBuilder(); virtual ~QQCarBuilder(); virtual addCarWheel() { m_car->addWheel(); }; virtual addCarBody() { m_car->addBody(); }; virtual addCarEngine() { m_car->addEngine(); }; virtual Car getCar() { return (*m_car); }; private: Car *m_car; }; class BuilderManager { public: BuilderManager(); virtual ~BuilderManager() {}; void productCar(BaseBuilder *builder) { if (nullptr != builder) { builder->addCarBody(); builder->addCarWheel(); builder->addCarEngine(); } }; }; void main() { BuilderManager manager; BMWCarBuilder *bmwBuilder = new BMWCarBuilder; QQCarBuilder *qqBuilder = new QQCarBuilder; manager.productCar(bmwBuilder); manager.productCar(qqBuilder); Car bmwCar = bmwBuilder->getCar(); Car qqCar = qqBuilder->getCar(); delete bmwBuilder; bmwBuilder = nullptr; delete qqBuilder; qqBuilder = nullptr; } #endif // !Builder_h