C++ 程式如何做到最大限度的可擴充套件

0 前言

Hello,大家好,歡迎來到』自由技藝『的 C++ 系列專題。先宣告下:今天的題目有點』標題黨『之嫌哈,最近手頭有個重構 C++ 程式碼的專案,對於如何保證其擴充套件性,最大程度方便開發者進行二次開發,始終沒有好的思路,於是想到了設計模式中的建造者模式,現分享給大家吧,但是感覺還是有點雞肋,不夠好,也歡迎各位大神指導一二,不甚感激。

1 什麼是建造者模式?

先看下類圖吧:

C++ 程式如何做到最大限度的可擴充套件

什麼意思呢?舉個例子:假如我們要造車,車有好多種型號,現有的流水線去如何去適應未來可能的新車型呢

首先,我們假設造車有幾項固定的流程:比如先造發動機(producePartA),然後造車殼(producePartB),再造輪胎(producePartC),最後再安個行車記錄儀或者倒車攝像頭啥的。

接下來,我們就開始造車了,比如要造兩款新車(Product1 和 Product2),那麼我們就需要對應的建造者類(ConcreteBuilder1 和 ConcreteBuilder2)就行。

建造者模式看起來擴充套件性很好,但是有個致命問題,就是造車的流程必須固定,如果某款車型需要在流程 A 和 流程 B 之間需要額外加一步,比如流程 A2,那就不好辦了,只能把這步流程融合在 A 裡或者 B 裡,但是呢?如果沒有建造者模式,我們只能採用以下兩種方式:

最簡單的方法是擴充套件造車基類, 然後建立一系列涵蓋所有引數組合的子類。 但最終你將面對相當數量的子類。 任何新增的引數都會讓這個層次結構更加複雜。

2。 另一種方法則無需生成子類。 你可以在造車基類中建立一個包括所有可能引數的超級建構函式, 並用它來控制車物件。 這種方法確實可以避免生成子類, 但它卻會造成另外一個問題。擁有大量輸入引數的建構函式也有缺陷: 這些引數也不是每次都要全部用上的。通常情況下, 絕大部分的引數都沒有使用, 這使得對於建構函式的呼叫十分不簡潔。

2 建造者模式 C++ 程式碼

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class Product1 {public: std::string parts; void listParts() { std::cout << “create products: ” << parts << “\n”; }};class Builder {public: virtual void producePartA() = 0; virtual void producePartB() = 0; virtual void producePartC() = 0;};class ConcreteBuilder1 : public Builder {private: Product1* product = nullptr;public: ConcreteBuilder1() { product = new Product1(); }; void reset() { product = new Product1(); }; void producePartA() { this->product->parts += “PartA1”; } void producePartB() { this->product->parts += “PartB1”; } void producePartC() { this->product->parts += “PartC1”; } Product1* getProduct() { auto result = this->product; reset(); return result; }};class Director {private: Builder* builder = nullptr;public: void setBuilder(Builder& builder) { this->builder = &builder; } void buildStdProduct() { builder->producePartA(); } void buildAdvanceProduct() { builder->producePartA(); builder->producePartB(); builder->producePartC(); }};int main(){ Director director; ConcreteBuilder1 builder; director。setBuilder(builder); director。buildStdProduct(); builder。getProduct()->listParts(); director。buildAdvanceProduct(); builder。getProduct()->listParts(); return 0;}

程式輸出:

C++ 程式如何做到最大限度的可擴充套件