提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

    image.png
    抽象工厂接口 IFactory 包含所有产品创建的抽象方法。而 ConcreteFactory* 就是具体的工厂。为创建不同的产品对象,客户端应使用不同的具体工厂。

    1. #include <iostream>
    2. #include <memory>
    3. /* 抽象产品类A */
    4. class VProductA {
    5. public:
    6. virtual void showFeature() const = 0;
    7. virtual ~VProductA() = default;
    8. };
    9. /* 具体产品类 A1 */
    10. class ConcreteProductA1 final : public VProductA {
    11. public:
    12. void showFeature() const override {
    13. std::cout << "Concrete Product A1 here\n";
    14. }
    15. ~ConcreteProductA1() = default;
    16. };
    17. /* 具体产品类 A2 */
    18. class ConcreteProductA2 final : public VProductA {
    19. public:
    20. void showFeature() const override {
    21. std::cout << "Concrete Product A2 here\n";
    22. }
    23. ~ConcreteProductA2() = default;
    24. };
    25. /* 抽象产品类B */
    26. class VProductB {
    27. public:
    28. virtual void showFeature() const = 0;
    29. virtual ~VProductB() = default;
    30. };
    31. /* 具体产品类 B1 */
    32. class ConcreteProductB1 final : public VProductB {
    33. public:
    34. void showFeature() const override {
    35. std::cout << "Concrete Product B1 here\n";
    36. }
    37. ~ConcreteProductB1() = default;
    38. };
    39. /* 具体产品类 B2 */
    40. class ConcreteProductB2 final : public VProductB {
    41. public:
    42. void showFeature() const override {
    43. std::cout << "Concrete Product B2 here\n";
    44. }
    45. ~ConcreteProductB2() = default;
    46. };
    47. /* 抽象工厂 */
    48. class VFactory {
    49. public:
    50. virtual std::unique_ptr<VProductA> CreateProductA() = 0;
    51. virtual std::unique_ptr<VProductB> CreateProductB() = 0;
    52. ~VFactory() = default;
    53. };
    54. /* 具体工厂1 */
    55. class Factory1 final : public VFactory {
    56. public:
    57. std::unique_ptr<VProductA> CreateProductA() {
    58. return std::make_unique<ConcreteProductA1>();
    59. }
    60. std::unique_ptr<VProductB> CreateProductB() {
    61. return std::make_unique<ConcreteProductB1>();
    62. }
    63. ~Factory1() = default;
    64. };
    65. /* 具体工厂2 */
    66. class Factory2 final : public VFactory {
    67. public:
    68. std::unique_ptr<VProductA> CreateProductA() {
    69. return std::make_unique<ConcreteProductA2>();
    70. }
    71. std::unique_ptr<VProductB> CreateProductB() {
    72. return std::make_unique<ConcreteProductB2>();
    73. }
    74. ~Factory2() = default;
    75. };
    76. auto main() -> int {
    77. std::unique_ptr<VFactory> fac = std::make_unique<Factory1>();
    78. auto productA = fac->CreateProductA();
    79. auto productB = fac->CreateProductB();
    80. productA->showFeature();
    81. productB->showFeature();
    82. fac.reset(new Factory2);
    83. std::cout << '\n';
    84. productA = fac->CreateProductA();
    85. productB = fac->CreateProductB();
    86. productA->showFeature();
    87. productB->showFeature();
    88. return 0;
    89. }