目录
Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
对象的创建:Builder模式是为对象的创建而设计的模式—创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法。
ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
Builder模式:
1、引擎工厂生产引擎产品,得到汽车部件A。
2、轮胎工厂生产轮子产品,得到汽车部件B。
3、底盘工厂生产车身产品,得到汽车部件C。
4、将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
5、将这个整体送到汽车组装工厂,得到一个汽车产品。
Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。
- #include <iostream>
- #include <string>
- using namespace std;
-
- //汽车
- class Car {
- public:
- void setWheel(string wheel)
- {
- this->m_wheel = wheel;
- }
-
- void setWindow(string window)
- {
- this->m_window = window;
- }
-
- void setFrame(string frame)
- {
- this->m_frame = frame;
- }
-
- string getWheel()
- {
- return m_wheel;
- }
-
- string getWindow()
- {
- return m_window;
- }
-
- string getFrame()
- {
- return m_frame;
- }
-
- private:
- string m_wheel;
- string m_window;
- string m_frame;
- };
-
- //建造者
- class Builder {
- public:
- virtual void makeWheel() = 0;
- virtual void makeWindow() = 0;
- virtual void makeFrame() = 0;
- virtual Car *getCar() = 0;
- };
-
- //汽车A
- class Car_A : public Builder {
- public:
- Car_A()
- {
- pCar = new Car;
- }
-
- virtual void makeWheel()
- {
- pCar->setWheel("wheel");
- }
-
- virtual void makeWindow()
- {
- pCar->setWindow("window");
- }
-
- virtual void makeFrame()
- {
- pCar->setFrame("frame");
- }
-
- virtual Car *getCar()
- {
- return pCar;
- }
-
- private:
- Car *pCar;
- };
-
- //汽车设计师
- class Director {
- public:
- void Construct(Builder *car)
- {
- car->makeWheel();
- car->makeWindow();
- car->makeFrame();
- }
- };
-
- int main() {
-
- //车主直接制造汽车
- Car *m_car = new Car;
- m_car->setWheel("mcar:wheel");
- m_car->setWindow("mcar:window");
- m_car->setFrame("mcar:frame");
- delete m_car;
-
- //制造者直接造汽车
- Builder *builder = new Car_A;
- builder->makeWheel();
- builder->makeWindow();
- builder->makeFrame();
- delete builder;
-
- //设计者指挥制造者和制造汽车
- Director *director = new Director;
- Builder *builder1 = new Car_A;
- director->Construct(builder1);
-
- Car *car = builder1->getCar();
- cout << car->getWheel() <<endl;
-
- delete car;
- delete builder1;
- delete director;
-
- return 0;
- }