(3)工厂方法

最简单的工厂方法模式(Factory Method Pattern) 的实现,代码简洁、结构清晰,只保留核心要素,便于理解。
核心思想
 - 定义一个创建对象的接口,但让子类决定实例化哪个类。
 - 父类负责定义流程,子类负责具体对象的创建。
// 创建者基类(定义工厂方法)
class Creator {
public:
    // 工厂方法:由子类实现
    virtual std::unique_ptr<Product> createProduct() = 0;

    // 使用产品(模板方法)
    void doSomething() {
        auto product = createProduct(); // 调用工厂方法创建对象
        if (product) {
            product->show();
        }
    }

    virtual ~Creator() = default;
};

// 具体创建者 A:创建 ProductA
class ConcreteCreatorA : public Creator {
public:
    std::unique_ptr<Product> createProduct() override {
        return std::make_unique<ProductA>();
    }
};

// 具体创建者 B:创建 ProductB
class ConcreteCreatorB : public Creator {
public:
    std::unique_ptr<Product> createProduct() override {
        return std::make_unique<ProductB>();
    }
};
// 创建者 A 创建产品 A
ConcreteCreatorA creatorA;
creatorA.doSomething(); // 输出: 这是产品 A
进阶-使用模板实现的最简工厂方法模式,避免了继承和虚函数,实现编译时多态,更加高效和简洁。
 - 用模板实现工厂方法模式的核心思想
 - 不使用虚函数,性能更高
 - 依然保持“创建与使用分离”的设计原则
// 完全泛型的工厂方法
template <typename T>
class GenericCreator {
public:
    template <typename... Args>
    std::unique_ptr<T> create(Args&&... args) {
        return std::make_unique<T>(std::forward<Args>(args)...);
    }
};

// 使用
GenericCreator<ProductA> factory;
auto obj = factory.create(); // 创建 ProductA
obj->show();
posted @ 2018-12-09 19:21  osbreak  阅读(374)  评论(0)    收藏  举报