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


    定义

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

    为什么使用简单工厂模式?

    1. 统一管理对象创建:
      • 简单工厂模式将对象的创建逻辑集中到一个工厂类中,客户端不需要知道具体的创建细节,只需调用工厂类提供的方法即可获得所需的对象,减少了客户端对类创建过程的依赖。
    2. 减少耦合:
      • 客户端与具体类之间的依赖被转移到了工厂类,客户端不再直接依赖具体类,从而降低了系统的耦合度。
    3. 更好的维护性:
      • 当需要更改对象的创建逻辑或引入新的对象类型时,只需修改工厂类,而不需要修改客户端代码,提高了系统的可维护性。

    实现步骤

    1. 定义抽象产品类

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

      • 实现产品接口的具体产品类,这些类包含了产品的实际业务逻辑。
    3. 定义工厂类

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

    优缺点和适用场景

    优点

    1. 统一管理对象创建

      • 将对象创建逻辑集中管理,使代码更加清晰易懂。
    2. 减少客户端与具体类的耦合

      • 客户端只需依赖于产品接口和工厂类,不再直接依赖具体产品类。
    3. 便于扩展和维护

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

    缺点

    1. 工厂类的职责过重

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

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

    适用场景

    1. 对象创建逻辑复杂

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

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

    咖啡店的例子

    假设我们有一个咖啡店,根据客户的需求生产不同类型的咖啡。我们可以使用简单工厂模式来实现咖啡的创建。
    复制代码
    #include 
    #include 
    #include <string>
    
    
    // 抽象产品类:咖啡
    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 << "Description: " << americano->getDescription() << ", Cost: " << americano->cost() << " RMB" << std::endl;
    
    
        // 创建拿铁咖啡
        std::shared_ptr latte = CoffeeFactory::createCoffee(CoffeeFactory::LATTE);
        std::cout << "Description: " << latte->getDescription() << ", Cost: " << latte->cost() << " RMB" << std::endl;
    
    
        return 0;
    }
    复制代码

     

  • 相关阅读:
    二维码在区域巡查中的应用:隐患上报、巡逻巡更、管线巡查
    高可用架构实现流量治理的策略
    【pytorch】数据加载dataset和dataloader的使用
    仿热血江湖游戏类45Int32
    网络库OKHTTP(3)拦截器扩展,一个好用的网络请求监控工具Chuck
    淘宝API接口
    个人博客类网站为什么更适合虚拟主机?
    Observability and Inconsistency in a Nutshell
    员工脉搏/脉动调查的5个好处
    Stable Diffusion 3.5发布:图像生成新纪元,多模态AI的突破!
  • 原文地址:https://www.cnblogs.com/best-doraemon/p/18306085