Design Pattern-Builder === # 建立模式(Builder) * 為一種創建模式 * 使用時機 : * 當class需要帶入的參數過多的時候 * 需要創件有特定配置的物件 * 目的 : * 簡化創件的過程且可提昇代碼的維護性 * 優點 : * 簡化了複雜對象的創建。每個步驟專注於對象配置的特定方面 * 建造者可以重用來創建具有不同配置的類似對象, 方便維護程式 * 建造者可以在建構過程中驗證參數 * 缺點 : * 如果須帶入的參數過於簡短會為程式帶來額外開銷或是複雜 * client端若未帶入需要的參數可能造成創見錯誤 # Flow chart ![image](https://hackmd.io/_uploads/rkfsKVV4A.png) 圖片來源 : [wiki](https://en.wikipedia.org/wiki/Builder_pattern) # Product * 假設今天我們要製作的產品是 iphone那會以下資訊 ```cpp= class Iphone{ public: string name; string color; string cpu; float screen_size; int resoltion_w; int resoltion_h; void info(){ cout << "Type : " << name << endl; cout << "CPU : " << cpu << endl; cout << "Color : " << color << endl; cout << "Screen_size : " << screen_size << endl; cout << "resoltion_w : " << resoltion_w << endl; cout << "resoltion_h : " << resoltion_h << endl; } }; ``` # Builder * Builder只是一個抽象概念,目的是可以讓Concrete Builder繼承後去實踐細節 * 如果今天產品改叫 "phone", 那我們也可以抽象一個"phone_builder",之後在改由各個廠牌去繼承"phone_builder"來去實踐各家的細節(ex : samsung_phone_builder,apple_phone_builder) ```cpp= class Iphone_Builder { public: virtual void set_name(string name) = 0; virtual void set_color(string name) = 0; virtual void set_cpu(string cpu) = 0; virtual void set_screen_size(float screen_size) = 0; virtual void set_resoltion_w(int w) = 0; virtual void set_resoltion_h(int h) = 0; virtual Iphone get_iphone() const = 0; }; ``` # Concrete Builder * 實踐Iphone_Builder細節的地方 ```cpp= class Iphone_Builder_Concrete : public Iphone_Builder{ public: void set_name(string name) override{ iphone.name = name; } void set_color(string color) override{ iphone.color = color; } void set_cpu(string cpu)override{ iphone.cpu = cpu; } void set_screen_size(float screen_size)override{ iphone.screen_size = screen_size; } void set_resoltion_w(int w) override{ iphone.resoltion_w = w; } void set_resoltion_h(int h) override{ iphone.resoltion_h = h; } Iphone get_iphone()const override{ return iphone; } private: Iphone iphone; }; ``` # Director * 指導者目的是要創建出最終想要的產品, 以下Director為Apple * 可以看到今天只要針對不同機型去做設定,即時參數再多也可以很清楚的表示並針對不同機型去做維護 ```cpp= class Apple{ public: Iphone make_I15(Iphone_Builder_Concrete& builder_concrete){ builder_concrete.set_name("I15"); builder_concrete.set_cpu("A16"); builder_concrete.set_screen_size(6.1); builder_concrete.set_color("White"); builder_concrete.set_resoltion_h(2556); builder_concrete.set_resoltion_w(1179); return builder_concrete.get_iphone(); } Iphone make_I15_pro(Iphone_Builder_Concrete& builder_concrete){ builder_concrete.set_name("I15 pro"); builder_concrete.set_cpu("A17"); builder_concrete.set_screen_size(6.1); builder_concrete.set_color("White"); builder_concrete.set_resoltion_h(2556); builder_concrete.set_resoltion_w(1179); return builder_concrete.get_iphone(); } Iphone make_I15_plus(Iphone_Builder_Concrete& builder_concrete){ builder_concrete.set_name("I15_plus"); builder_concrete.set_cpu("A16"); builder_concrete.set_screen_size(6.7); builder_concrete.set_color("White"); builder_concrete.set_resoltion_h(2796); builder_concrete.set_resoltion_w(1290); return builder_concrete.get_iphone(); } }; ``` # 最後輸出 ```cpp= int main() { Iphone_Builder_Concrete builder_concrete; Apple apple; Iphone iphone = apple.make_I15_plus(builder_concrete); iphone.info(); return 0; } ``` github : https://github.com/GU-Lin/Design_Pattern_Practice/tree/main/Creational/Builder source :https://www.geeksforgeeks.org/builder-pattern-c-design-patterns/#advantages-of-the-builder-patterns-in-c https://hypc-pub.github.io/design-patterns/patterns/builder-pattern.html ###### tags : `Creational` `DesignPattern`