找回密码
 立即注册
首页 业界区 业界 设计模式之简单工厂模式(学习笔记)

设计模式之简单工厂模式(学习笔记)

铵滔 2025-6-9 09:08:43
定义

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它定义一个用于创建对象的接口,但由一个单独的类来实现实际创建的工作。简单工厂模式通过在一个类中集中管理对象的创建过程,可以减少客户端与具体类之间的耦合,使得代码结构更加清晰和易于维护。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。为什么使用简单工厂模式?


  • 统一管理对象创建:

    • 简单工厂模式将对象的创建逻辑集中到一个工厂类中,客户端不需要知道具体的创建细节,只需调用工厂类提供的方法即可获得所需的对象,减少了客户端对类创建过程的依赖。

  • 减少耦合:

    • 客户端与具体类之间的依赖被转移到了工厂类,客户端不再直接依赖具体类,从而降低了系统的耦合度。

  • 更好的维护性:

    • 当需要更改对象的创建逻辑或引入新的对象类型时,只需修改工厂类,而不需要修改客户端代码,提高了系统的可维护性。

实现步骤


  • 定义抽象产品类

    • 定义所有具体产品类的共同接口,客户端将通过这个接口来使用具体产品。

  • 实现具体产品类

    • 实现产品接口的具体产品类,这些类包含了产品的实际业务逻辑。

  • 定义工厂类

    • 定义一个工厂类,包含一个用于创建产品对象的静态方法,根据不同的参数来实例化不同的具体产品类,并返回产品接口类型的对象。

优缺点和适用场景

优点


  • 统一管理对象创建

    • 将对象创建逻辑集中管理,使代码更加清晰易懂。

  • 减少客户端与具体类的耦合

    • 客户端只需依赖于产品接口和工厂类,不再直接依赖具体产品类。

  • 便于扩展和维护

    • 添加新产品类时,只需修改工厂类,客户端代码无需变动。

缺点


  • 工厂类的职责过重

    • 工厂类集中了所有产品对象的创建逻辑,可能导致代码过于复杂,不利于扩展。

  • 不符合开闭原则

    • 添加新产品时需要修改工厂类的代码,违背了开闭原则。

适用场景


  • 对象创建逻辑复杂

    • 当对象的创建过程较为复杂时,可以使用简单工厂模式将创建逻辑集中管理,简化客户端代码。

  • 客户端不需要关心对象的创建细节

    • 当客户端不需要知道对象的创建过程,只需使用对象时,可以使用简单工厂模式隐藏创建细节。

咖啡店的例子

假设我们有一个咖啡店,根据客户的需求生产不同类型的咖啡。我们可以使用简单工厂模式来实现咖啡的创建。[code]#include #include #include // 抽象产品类:咖啡class Coffee {public:    virtual ~Coffee() {}    virtual std::string getDescription() const = 0;    virtual double cost() const = 0;};// 具体产品类:美式咖啡class Americano : public Coffee {public:    std::string getDescription() const override {        return "Americano";    }    double cost() const override {        return 5.0;    }};// 具体产品类:拿铁咖啡class Latte : public Coffee {public:    std::string getDescription() const override {        return "Latte";    }    double cost() const override {        return 6.0;    }};// 简单工厂类class CoffeeFactory {public:    enum CoffeeType {        AMERICANO,        LATTE    };    static std::shared_ptr createCoffee(CoffeeType type) {        switch (type) {            case AMERICANO:                return std::make_shared();            case LATTE:                return std::make_shared();            default:                return nullptr;        }    }};int main() {    // 创建美式咖啡    std::shared_ptr americano = CoffeeFactory::createCoffee(CoffeeFactory::AMERICANO);    std::cout
您需要登录后才可以回帖 登录 | 立即注册