创建型模式之建造者模式

xiaoxiao2021-02-27  375

原文链接:点击打开链接

功能:将一个复杂对象的构建表示分离,使得同样的构建过程可以创建不同的表示。

优点: 

客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。每一个具体建造者都独立,因此可以方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭”

缺点: 

建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,若产品之间的差异性很大,则不适合使用该模式,因此其使用范围受到一定限制。若产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

模式应用:

  很多游戏软件中,地图包括天空、地面、背景等组成部分,人物角色包括人体、服装、装备等组成部分,可以使用建造者模式对其进行设计,通过不同的具体建造者创建不同类型的地图或人物。

举例: KFC套餐

套餐是一个复杂对象,一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、 可乐等)等部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。

C++代码:

#ifndef BUILDER_H #define BUILDER_H #include <iostream> #include <string> #include <vector> using std::string; using std::vector; using std::cout; using std::endl; class CMeal{ private: vector<string > menu; public: void Add(string temp){ menu.push_back(temp); } void Show(){ for(vector<string>::iterator it=menu.begin();it!=menu.end();it++){ cout<<*it<<" "; } cout<<endl; } }; class CMealBuilder{ public: virtual void BuildFood()=0; virtual void BuildDrink()=0; virtual void Show()=0; }; class CMealFirst : public CMealBuilder{ private: CMeal* pMeal; public: CMealFirst(){ pMeal=new CMeal; } virtual void BuildFood(){ pMeal->Add("hamburger"); } virtual void BuildDrink(){ pMeal->Add("milk"); } virtual void Show(){ pMeal->Show(); } }; class CMealSecond : public CMealBuilder{ private: CMeal* pMeal; public: CMealSecond(){ pMeal=new CMeal; } virtual void BuildFood(){ pMeal->Add("rice"); } virtual void BuildDrink(){ pMeal->Add("beer"); } virtual void Show(){ pMeal->Show(); } }; class CManager{ public: void Create(CMealBuilder* pMealBuilder){ pMealBuilder->BuildDrink(); pMealBuilder->BuildFood(); } }; #endif #include <iostream> #include "builder.h" int main(){ CManager* pManager=new CManager; CMealFirst* pMealFirst=new CMealFirst; CMealSecond* pMealSecond=new CMealSecond; pManager->Create(pMealFirst); pMealFirst->Show(); pManager->Create(pMealSecond); pMealSecond->Show(); return 0; }

转载请注明原文地址: https://www.6miu.com/read-1846.html

最新回复(0)