解决的问题:
我创建的这个对象比较复杂,且该对象里面的成员函数用不同的实现来表示不同的实例,换句话说 就是同样的对象构建过程可以有不同的表示。比如我那天去吃过桥米线,他们有不同的套餐,套餐里包含的种类是一样的, 都有一碗米线,一份凉菜,一杯饮料。但是不同的套餐里这3样又都不是全部一样的。此时我们就可以用建造者模式。
类图结构:
1.建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应 用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(Concrete Builder)角色。具体建造者类必须实现这个接口 所要求的方法:一个是建造方法,另一个是结果返还方法。此时就是米线店的员工,按照收银员的要求的去准备具体的套餐 ,放入适当的米线,凉菜和饮料。
2.具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相 关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:实现Builder角色提供的接口,一步一步完 成创建产品实例的过程。在建造过程完成后,提供产品的实例。是具体的做某个套餐的员工。
3.指导者(Director )角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体 知识的是具体建造者对象。是收银员,他知道我想要什么套餐,他会告诉里面的米线店员工去准备什么套餐。
4.产 品(Product)角色:产品便是建造中的复杂对象。指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的 请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为 客户端所知。就是最后的套餐,所有东西放到一起端过来。
样例实现:
// CplusplusBuild.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <vector> #include <string> #include <iostream> using namespace std; //product class Food { private:<strong> </strong>vector<string> mFoodName; vector<int> mFoodPrice; public: void add(string foodName,int price) { mFoodName.push_back(foodName); mFoodPrice.push_back(price); } void show() { cout<<"Food List" <<endl; cout<<"-------------------"<<endl; for(int i=0;i<mFoodName.size();i++) { cout<<mFoodName[i]<<" "<<mFoodPrice[i]<<endl; } } }; //builder class Builder { public: virtual void BuildRiceNoodles() {}; virtual void BuildCoolDish(){}; virtual void BuildDrink(){}; virtual Food * getFood(){return NULL;} }; //builderA class BuilderA:public Builder { private: Food *food; public: BuilderA(){food = new Food();} void BuildRiceNoodles() { food->add("RiceNoodlesA",20); } void BuildCoolDish() { food->add("CoolDishA",20); } void BuildDrink() { food->add("DrinkA",20); } Food * getFood() { return food; } }; //builderB class BuilderB:public Builder { private: Food *food; public: BuilderB(){food = new Food();} void BuildRiceNoodles() { food->add("RiceNoodlesB",10); } void BuildCoolDish() { food->add("CoolDishB",10); } void BuildDrink() { food->add("DrinkB",10); } Food * getFood() { return food; } }; //director class FoodManager { public: void Construct(Builder * builder) { builder->BuildRiceNoodles(); builder->BuildDrink(); builder->BuildCoolDish(); } }; //clent int _tmain(int argc, _TCHAR* argv[]) { FoodManager *foodManager= new FoodManager(); Builder * builder = new Builder(); // the following code can use simple factory; char ch; cout<<"input your food Type (A or B):"; cin>>ch; if(ch=='A') { builder = new BuilderA(); }else if(ch=='B') { builder = new BuilderB(); } foodManager->Construct(builder); Food * food = builder->getFood(); food->show(); return 0; }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 产品
, 实例
, 接口
, c++ push_back
, 角色
, 具体实现
, 拓路者
, 建造者模式
, 不同
, android建造者模式
建造者设计模式
设计模式c 实现、c语言实现设计模式、设计模式 建造者模式、设计建造模式、c 建造者模式,以便于您获取更多的相关知识。