Template_Builder_DesignPattern

模板方法模式 建造者模式 C++实现

今天我继续来填坑,模板方法模式就是在模板方法中按照一定的规则顺序调用基本方法。这个比较简单。

比如我在父类run()中调用类中一系列的方法。钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。

Java中,如果父类里面有些方法不允许覆写,那么为了防止子类改变模板方法中的算法,可以将模板方法声明为final。

> #include using namespace std; class CarTemplate { public: CarTemplate(void){}; virtual ~CarTemplate(void){}; protected: virtual void Start() = 0; virtual void Stop() = 0; virtual void Alarm() = 0; virtual void EngineBoom() = 0; virtual bool IsAlarm() =0; public: void Run() { Start(); EngineBoom(); if(IsAlarm()) Alarm(); Stop(); }; }; class Hummer: public CarTemplate { public: Hummer(){m_isAlarm = true;} virtual ~Hummer(){}; protected: void Start(){ cout<< "Hummer Start" << endl; } void Stop(){ cout<< "Hummer Stop" << endl; } void Alarm(){ cout<< "Hummer Alarm" << endl;} bool IsAlarm(){ return m_isAlarm; } void EngineBoom(){ cout<< "Hummer EngineBoom" << endl; } private: bool m_isAlarm; }; class Benz: public CarTemplate { public: Benz(){m_isAlarm = false;} virtual ~Benz(){}; protected: void Start(){ cout<< "Benz Start" << endl; } void Stop(){ cout<< "Benz Stop" << endl; } void Alarm(){ cout<< "Benz Alarm" << endl;} bool IsAlarm(){ return m_isAlarm; } void EngineBoom(){ cout<< "Benz EngineBoom" << endl; } private: bool m_isAlarm; }; int main() { CarTemplate *hummer = new Hummer(); hummer->Run(); delete hummer; CarTemplate *benz = new Benz(); benz->Run(); delete benz; } </code></pre> 优点就在于可以封装不变的部分,拓展可变的部分,也就是把共性的东西抽取出来,这样可以便于维护。 但是缺点在于子类的执行,影响到父类的结果。有时候会有一些晦涩难懂。 ———————————————————————————————- ***在模板方法中,我们把相同的都封装在父类中,不同都定义在子类中。但是需求的变化是无穷无尽的。*** > 比如建造的顺序可能是变化的,所以将他放到builder类中,通过builder类获取真正的product! ![](/assets/pic/6446jgG.gif)

class Builder
{
public:
    virtual void BuildHead() {}
    virtual void BuildBody() {}
    virtual void BuildLeftArm(){}
    virtual void BuildRightArm() {}
    virtual void BuildLeftLeg() {}
    virtual void BuildRightLeg() {}
};
//构造瘦人
class ThinBuilder:public Builder
{
public:
    void BuildHead() { cout<< "build thin body" << endl; }
    void BuildBody() { cout<< "build thin head" << endl; }
    void BuildLeftArm() { cout<< "build thin leftarm" << endl; }
    void BuildRightArm() { cout<< "build thin rightarm" << endl; }
    void BuildLeftLeg() { cout<< "build thin leftleg" << endl; }
    void BuildRightLeg() { cout<< "build thin rightleg" << endl; }
};
//构造胖人
class FatBuilder : public Builder
{
public:
    void BuildHead() { cout<<"build fat body"<< endl; }
    void BuildBody() { cout<<"build fat head"<< endl; }
    void BuildLeftArm() { cout<<"build fat leftarm"<< endl; }
    void BuildRightArm() { cout<<"build fat rightarm"<< endl; }
    void BuildLeftLeg() { cout<<"build fat leftleg"<< endl; }
    void BuildRightLeg() { cout<<"build fat rightleg"<< endl; }   
};   //构造的指挥官   

class Director     {   
private:       
    Builder *m_pBuilder;   
public:       
    Director(Builder *builder) { m_pBuilder = builder; }       
    void Create()
    {           
        m_pBuilder->BuildHead();
        m_pBuilder->BuildBody();
        m_pBuilder->BuildLeftArm();
        m_pBuilder->BuildRightArm();
        m_pBuilder->BuildLeftLeg();
        m_pBuilder->BuildRightLeg();
    }
};
 
int main()
{
    FatBuilder fat;
    Director director(&fat);
    director.Create();
---------------------------------------------------------------------------
    Builder *thin = new ThinBuilder();
    Director *dir = new Director(thin);
    dir->Create();
 
    return 0;
}
___建造者模式的优点:在于我们不用关心每个产品内部的组成细节,比如FatBuildier ThinBuilider,然后我们交给Director来构造就好了。___ 建造者是独立的,我们可以拓展更多的builder完成不同的功能。并不对系统有任何影响。 ___特别适合产品类特别复杂,顺序不同,效能不同。顺序是区别模板模式与建造者模式最大的不同点!__ > 另外同工厂模式进行比较,工厂模式适合生产零件。不能再细分了。否则就不适合工厂模式。 #####把模板方式和建造者模式组合起来可以产生很好的效果,可以按照model通过builder批量生产某种特定型号的产品。 ![](/assets/pic/IMG_0433.jpg)