C++設計模式---建造者模式

建造者模式

含義:

       將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。用具體的示例來說,就是裝配一部手機,需要先放主板,再放屏幕,再放電池,最後組裝外殼形成手機;而且每次發佈新產品手機,更換更大的屏幕或者電池或者其他零部件,就又能賣出更好的價錢了。就是說,這些步驟都沒變,變得只是每個部分的東西。

優點:

  1. 隔離了構建的步驟和具體的實現,爲產品的具體實現提供了靈活度;
  2. 封裝和抽象了每個步驟的實現,實現了依賴倒轉原則;
  3. 封裝了具體的步驟,減少了代碼的冗餘;

缺點:

  1. 要求構建產品的步驟(算法)是不能劇烈變化的,最好是不變的,這樣就影響了靈活度;

對象說明:

  1. Director:指揮者,指揮建造產品的流程,或者負責安排已有模塊的順序,然後告訴Builder開始建造;
  2. Product產品類:通常是實現了模板方法模式,也就是有模板方法和基本方法;
  3. Builder抽象建造者:規範產品的組建,一般是由子類實現;
  4. ConcreteBuilder具體建造者:實現抽象類定義的所有方法,並且返回一個組建好的對象;

【筆者思考】

     首先創建產品類(基類),每一個產品類下可以有多個產品(派生類),然後使用Builder類(基類)構建生產的規範,ConcreteBuilder(多個派生類)根據Builder類的規範分別進行每一個零部件的生產或組裝,最後由Director類來指揮每一個零部件組裝或生產前後的順序。

示例:

//
//  main.cpp
//  builder_pattern
//
//  Created by apple on 2019/3/12.
//  Changed by apple on 2019/3/31
//  Copyright © 2019年 apple. All rights reserved.
//

#include <iostream>
#include <string>
using std::cout;
using std::endl;

class IProduct//抽象產品類
{
public:
    int num = 0;
    virtual ~IProduct() {}
    virtual void product() {this->num++;}
    virtual void test() = 0;
};
class Product:public IProduct//實際產品
{
public:
    void test(){cout<<"level "<<this->num<<" product succeed!"<<endl;}
};

class IBuilder//建造者接口定義了建造者的建造方法
{
public:
    IProduct *product = NULL;
    virtual void first_step() = 0;
    virtual void second_step() = 0;
    virtual void third_step() = 0;
    virtual IProduct *GetProduct() = 0;
    virtual ~IBuilder() {}
};
class Builder_A:public IBuilder//A建造者
{//建造者可以擁有很多用於構造產品的方法
public:
    Builder_A() {this->product = new Product();}
    void first_step(){product->product();cout<<"Builder_A first_step"<<endl;}
    void second_step(){product->product();cout<<"Builder_A second_step"<<endl;}
    void third_step(){product->product();cout<<"Builder_A third_step"<<endl;}
    IProduct *GetProduct(){
        return product;
    }
    ~Builder_A() {delete product;}
};
class Builder_B:public IBuilder//B_建造者
{//建造者可以擁有很多用於構造產品的方法
public:
    Builder_B() {this->product = new Product();}
    void first_step(){product->product();cout<<"Builder_B first_step"<<endl;}
    void second_step(){product->product();cout<<"Builder_B second_step"<<endl;}
    void third_step(){}//注意third_step方法的區別
    IProduct *GetProduct(){
        return product;
    }
    ~Builder_B() {delete product;}
};
class Director//導演類,使建造者執行命令
{
private:
    IBuilder *builder;
public:
    void setBuilder(IBuilder *builder){this->builder = builder;}
    void command_A(){
        builder->first_step();
        builder->second_step();
        builder->third_step();
        this->builder->GetProduct();
        cout<<"Director command succeed by command_A."<<endl;
    }
    void command_B(){
        builder->first_step();
        builder->second_step();
        builder->third_step();
        this->builder->GetProduct();
        cout<<"Director command succeed by command_B."<<endl;
    }
};

int main(int argc, const char * argv[]) {
    Director director;//棧上導演
    IBuilder *builder = NULL;//堆上建造者
    
    builder = new Builder_A();
    director.setBuilder(builder);
    director.command_A();
    builder->GetProduct()->test();
    delete builder;
    builder = NULL;
    
    builder = new Builder_B();
    director.setBuilder(builder);
    director.command_B();
    builder->GetProduct()->test();
    delete builder;
    builder = NULL;
    return 0;
}

參考

建造者模式 C++實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章