使一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

    建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式。
    image.png

    1. #include <iostream>
    2. #include <memory>
    3. #include <vector>
    4. /* 产品类,构建的内容 */
    5. class Product {
    6. public:
    7. void add(std::string part) { vec.emplace_back(part); }
    8. void show() {
    9. for (const auto &str : vec) {
    10. std::cout << str << ' ';
    11. }
    12. std::cout << "\n";
    13. }
    14. private:
    15. std::vector<std::string> vec;
    16. };
    17. class Builder {
    18. public:
    19. virtual void buildPartA() = 0;
    20. virtual void buildPartB() = 0;
    21. virtual Product getProduct() = 0;
    22. };
    23. class ConcreteBuilder1 final : public Builder {
    24. public:
    25. void buildPartA() override { pro.add("part A"); }
    26. void buildPartB() override { pro.add("part B"); }
    27. Product getProduct() override { return pro; }
    28. private:
    29. Product pro;
    30. };
    31. /* 具体建造者 */
    32. class ConcreteBuilder2 final : public Builder {
    33. public:
    34. void buildPartA() override { pro.add("part X"); }
    35. void buildPartB() override { pro.add("part Y"); }
    36. Product getProduct() override { return pro; }
    37. private:
    38. Product pro;
    39. };
    40. /* 指挥者类,用于指挥构造 */
    41. class Director {
    42. public:
    43. void Construct(const std::shared_ptr<Builder> &builder) {
    44. builder->buildPartA();
    45. builder->buildPartB();
    46. }
    47. };
    48. auto main() -> int {
    49. Director director;
    50. std::shared_ptr<Builder> b1 = std::make_shared<ConcreteBuilder1>();
    51. std::shared_ptr<Builder> b2 = std::make_shared<ConcreteBuilder2>();
    52. director.Construct(b1);
    53. Product p1 = b1->getProduct();
    54. p1.show();
    55. director.Construct(b2);
    56. Product p2 = b2->getProduct();
    57. p2.show();
    58. return 0;
    59. }