商城網(wǎng)站制作方案100個免費推廣網(wǎng)站
鏈接:C++ 設(shè)計模式
鏈接:C++ 設(shè)計模式 - 工廠方法
鏈接:C++ 設(shè)計模式 - 抽象工廠
鏈接:C++ 設(shè)計模式 - 原型模式
建造者模式(Builder Pattern)是一種創(chuàng)建型設(shè)計模式,它允許你分步驟創(chuàng)建復(fù)雜對象。與其他創(chuàng)建型模式不同,建造者模式不僅關(guān)注對象的創(chuàng)建,還關(guān)注對象的組裝過程。
1.問題分析
在軟件開發(fā)中,有時我們需要創(chuàng)建一個復(fù)雜對象,這個對象由多個部分組成,并且這些部分的構(gòu)建過程可能非常復(fù)雜。直接使用構(gòu)造函數(shù)來創(chuàng)建這樣的對象會導(dǎo)致代碼難以維護和擴展。建造者模式通過將對象的構(gòu)建過程與表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
2.實現(xiàn)步驟
- 定義產(chǎn)品類:定義一個復(fù)雜對象類,該類包含多個部分。
- 定義建造者接口:定義一個包含構(gòu)建各個部分方法的接口。
- 實現(xiàn)具體建造者類:實現(xiàn)建造者接口,提供構(gòu)建各個部分的具體實現(xiàn)。
- 定義指揮者類:定義一個指揮者類,用于控制建造過程。
- 客戶端代碼:使用指揮者類和具體建造者類來創(chuàng)建復(fù)雜對象。
3.代碼示例
3.1.定義產(chǎn)品類
// 機器人類
class Robot {public:void setHead(const std::string& head) { head_ = head; }void setBody(const std::string& body) { body_ = body; }void setArms(const std::string& arms) { arms_ = arms; }void setLegs(const std::string& legs) { legs_ = legs; }void show() const { std::cout << "Robot Parts: " << head_ << ", " << body_ << ", " << arms_ << ", " << legs_ << std::endl; }private:std::string head_;std::string body_;std::string arms_;std::string legs_;
};
3.2.定義建造者接口
// 建造者接口
class RobotBuilder {public:virtual ~RobotBuilder() = default;virtual void buildHead() = 0;virtual void buildBody() = 0;virtual void buildArms() = 0;virtual void buildLegs() = 0;virtual std::unique_ptr<Robot> getResult() = 0;protected:std::unique_ptr<Robot> robot_ = std::make_unique<Robot>();
};
3.3.實現(xiàn)具體建造者類
// 清潔機器人建造者類
class CleaningRobotBuilder : public RobotBuilder {public:void buildHead() override { robot_->setHead("Cleaning Head"); }void buildBody() override { robot_->setBody("Cleaning Body"); }void buildArms() override { robot_->setArms("Cleaning Arms"); }void buildLegs() override { robot_->setLegs("Cleaning Legs"); }std::unique_ptr<Robot> getResult() override { return std::move(robot_); }
};
// 巡檢機器人建造者類
class InspectionRobotBuilder : public RobotBuilder {public:void buildHead() override { robot_->setHead("Inspection Head"); }void buildBody() override { robot_->setBody("Inspection Body"); }void buildArms() override { robot_->setArms("Inspection Arms"); }void buildLegs() override { robot_->setLegs("Inspection Legs"); }std::unique_ptr<Robot> getResult() override { return std::move(robot_); }
};
3.4.定義指揮者類
// 指揮者類
class RobotDirector {public:void setBuilder(RobotBuilder* builder) { builder_ = builder; }std::unique_ptr<Robot> construct() {builder_->buildHead();builder_->buildBody();builder_->buildArms();builder_->buildLegs();return builder_->getResult();}private:RobotBuilder* builder_;
};
3.5.客戶端代碼
int main() {// 創(chuàng)建具體建造者對象CleaningRobotBuilder cleaningBuilder;InspectionRobotBuilder inspectionBuilder;// 創(chuàng)建指揮者對象并設(shè)置建造者RobotDirector director;// 構(gòu)建清潔機器人director.setBuilder(&cleaningBuilder);std::unique_ptr<Robot> cleaningRobot = director.construct();cleaningRobot->show();// 構(gòu)建巡檢機器人director.setBuilder(&inspectionBuilder);std::unique_ptr<Robot> inspectionRobot = director.construct();inspectionRobot->show();return 0;
}
4.總結(jié)
-
建造者模式(Builder Pattern)
- 創(chuàng)建過程:指揮者控制對象的創(chuàng)建過程,按特定順序構(gòu)建對象。
- 目的:將復(fù)雜對象的構(gòu)建過程與其表示分離。
- 適用場景:
- 需要逐步構(gòu)建復(fù)雜對象,并且構(gòu)建過程可以有不同的表示。
- 對象由多個部分組成,每個部分可以獨立構(gòu)建。
- 需要控制對象的創(chuàng)建過程。
-
工廠模式(Factory Pattern)
- 創(chuàng)建過程:工廠決定創(chuàng)建哪個具體對象,創(chuàng)建過程較為簡單。
- 目的:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。
- 適用場景:
- 需要創(chuàng)建的對象類型在運行時才確定。
- 需要將對象的創(chuàng)建與使用分離。
- 對象通常是一個整體,創(chuàng)建時不需要逐步構(gòu)建。