Builder-- 建造者模式: 将一个复杂对象的构建和表示分离, 使得同样的构建过程可以有不同的表示。
从定义可以看出, builder模式有两个重要的点,
1. 构建与表示分离
2. 同样的构建过程有不同的表示。
这里可以看出,对于builder模式来说, 构建过程是相同的。而在构建过程中,根据不同的需求。构建出不同的对象。
建造者模式属于对象创建型模式, 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,
用户不需要知道内部的具体构建细节(即构建过程)
builder模式的UML图:
1. Director: 指挥者, 根据客户的提示, 决定构建使用哪种builder 构建产品
2. Builder: 抽象构建类,定义了构建的过程。
3. ConcreteBuilder: 实际的构建类,构建不同的产品
4. product: 需要构建的产品, 具体的构建类,将在每一步的时候,对产品的部分进行构造,最后完成。
builder模式的使用场景:
当创建复杂对象时,对象内部的的建造顺序是稳定的,但是当对象的每一个部件,都有着不同的变化,可以使用builder 模式。
举例:
一家生意很好的饭店,最近遭到了竞争,他们观察对手,发现对手针对不同的人群推出了多种套餐,如套餐A: 绿豆面+红豆汤+萝卜丝 套餐B:凉皮+冰峰。 套餐C:鸡腿饭+可乐
老板观察后,决定也推出相应的套餐。并使用建造者模式,提高套餐生成效率
套餐= 主食+饮品+小吃
1 class Waiter 2 { 3 private: 4 BuildTaocan* _taocan; 5 public: 6 void setTaocan(BuildTaocan* tc) 7 { 8 this->_taocan = tc; 9 } 10 11 void Construct() 12 { 13 _taocan->addFood(); 14 _taocan->addDrink(); 15 _taocan->addsnacks(); 16 } 17 18 }; 19 20 class BuildTaocan 21 { 22 virtual void addFood(); 23 virtual void addDrink(); 24 virtual void addsnacks(); 25 virtual void getTaocan(); 26 }; 27 28 class BuildTaocanA 29 { 30 private: 31 TaoCan _tc; 32 public: 33 virtual void getTaocan() 34 { 35 cout << "taocan a" << _tc.food() << _tc.Drink() << _tc.snacks() << endl; 36 } 37 virtual void addDrink() 38 { 39 tc.setDrink("hongdoutang"); 40 } 41 virtual void addFood() 42 { 43 tc.setFood("lvdoumian"); 44 } 45 };
client:
Waiter waiter();
BuildTaoCanA cana;
waiter.setTaocan(&cana);
waiter.Construct();
cana.getTaocan();