定会一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。

    简单工厂模式的最大优点在于:工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
    但是如果要增加功能,就需要增加 case 分支条件,修改原有的类(不仅对扩展开放了,对修改也开放了),违背开放-封闭原则
    image.png
    将工厂类抽象出一个接口,只有一个方法——创建抽象产品的工厂方法所有要生产具体类的工厂就去实现这个接口

    1. #include <iostream>
    2. #include <memory>
    3. class Product {
    4. public:
    5. void func1() { std::cout << "func1\n"; }
    6. void func2() { std::cout << "func2\n"; }
    7. void func3() { std::cout << "func3\n"; }
    8. };
    9. class ConcreteProduct1 final : public Product {};
    10. class ConcreteProduct2 final : public Product {};
    11. class ProductFactory {
    12. public:
    13. virtual std::unique_ptr<Product> createProduct() = 0;
    14. };
    15. class ConcreteProduct1Factory final : public ProductFactory {
    16. public:
    17. std::unique_ptr<Product> createProduct() {
    18. return std::make_unique<ConcreteProduct1>();
    19. }
    20. };
    21. class ConcreteProduct2Factory final : public ProductFactory {
    22. public:
    23. std::unique_ptr<Product> createProduct() {
    24. return std::make_unique<ConcreteProduct2>();
    25. }
    26. };
    27. auto main() -> int {
    28. std::unique_ptr<ProductFactory> pf =
    29. std::make_unique<ConcreteProduct1Factory>();
    30. std::unique_ptr<Product> product = pf->createProduct();
    31. product->func1();
    32. product->func2();
    33. product->func3();
    34. pf = std::make_unique<ConcreteProduct2Factory>();
    35. product = pf->createProduct();
    36. product->func1();
    37. product->func2();
    38. product->func3();
    39. }

    实际上也有缺点:每加一个产品就需要增加一个产品工厂的类,增加了额外的开发量。