想要搞清楚建造者模式,首先先要了解建造者模式种四个角色的定位
优点:
缺点:
但是也能感受到它的缺点,我们要扩展ConcreteBuilder,前提是什么?它必须具备和其它产品的共同点,甚至要有非常多的共同点。至少流程必须类似。比如这个Builder能制造计算机,对于手机那就可能做不了了。
- #include
- #include
- #include
-
- using namespace std;
- /*
- 建造者模式
- 组装电脑:显示器 主机 键盘 鼠标
- */
-
- /*
- 1. 抽象产品类
- */
- class AbstractProduct
- {
- public:
- virtual ~AbstractProduct() {}
- virtual void setDisplay(string display) = 0;
- virtual void setHost(string host) = 0;
- virtual void setKeyBoard(string KeyBoard) = 0;
- virtual void setMouse(string mouse) = 0;
- virtual void show() = 0;
- };
-
- /*
- 2. 具体产品类
- */
- class Computer :public AbstractProduct
- {
- public:
- ~Computer() {}
- void setDisplay(string display)
- {
- m_vec.emplace_back(display);
- }
- void setHost(string host)
- {
- m_vec.emplace_back(host);
- }
- void setKeyBoard(string KeyBoard)
- {
- m_vec.emplace_back(KeyBoard);
- }
- void setMouse(string mouse)
- {
- m_vec.emplace_back(mouse);
- }
- void show()
- {
- cout << "----------组装电脑---------" << endl;
- for (auto& x : m_vec)
- {
- cout << x << endl;
- }
- }
- private:
- vector
m_vec; - };
-
- /*
- 3. 抽象建造者
- */
- class AbstractBuilder
- {
- public:
- //创建电脑产品
- AbstractBuilder()
- :product(new Computer) {}
- virtual ~AbstractBuilder() {}
- //抽象电脑产品创建的统一抽象接口
- virtual void BuildDisplay(string display) = 0;
- virtual void BuildHost(string host) = 0;
- virtual void BuildKeyBoard(string KeyBoard) = 0;
- virtual void BuildMouse(string mouse) = 0;
- AbstractProduct* getProduct()
- {
- return product;
- }
- protected:
- AbstractProduct* product;
- };
-
- /*
- 4. 具体建造者:具体实现抽象建造者各个部件的接口
- */
- class ComputerBuilder :public AbstractBuilder
- {
- public:
- ~ComputerBuilder() {}
- void BuildDisplay(string display)
- {
- product->setDisplay(display);
- }
- void BuildHost(string host)
- {
- product->setHost(host);
- }
- void BuildKeyBoard(string KeyBoard)
- {
- product->setKeyBoard(KeyBoard);
- }
- void BuildMouse(string mouse)
- {
- product->setMouse(mouse);
- }
- };
-
- /*
- 5. 指挥者:安排和调度复杂对象的创建过程
- */
- class Director
- {
- public:
- Director(AbstractBuilder* builder)
- :m_builder(builder) {}
- ~Director() {}
- AbstractProduct* createComputer(string display, string host, string KeyBoard, string mouse)
- {
- m_builder->BuildDisplay(display);
- m_builder->BuildHost(host);
- m_builder->BuildKeyBoard(KeyBoard);
- m_builder->BuildMouse(mouse);
- return m_builder->getProduct();
- }
- private:
- AbstractBuilder* m_builder;
- };
- int main()
- {
- //1. 创建电脑建造者
- AbstractBuilder* Computer_Builder = new ComputerBuilder;
- //2. 创建电脑建造者的 管理者
- Director* pDcomp = new Director(Computer_Builder);
- //3. 管理者指挥 建造者制造电脑产品
- AbstractProduct* computerPro = pDcomp->createComputer("联想显示器", "外星人主机", "雷蛇键盘", "罗技鼠标");
- //4. 电脑产品制造完成
- computerPro->show();
-
- //别忘了释放内存
- delete Computer_Builder;
- delete pDcomp;
- delete computerPro;
-
- return 0;
- }
2.5 万字详解:23 种设计模式 - 知乎 (zhihu.com)
C++设计模式:建造者模式(详解+案例代码)_Yuleo_的博客-CSDN博客