设计模式-工厂模式

工厂模式简介

工厂模式(Factory Pattern) 是一种创建型设计模式,它提供了一种创建对象的接口,而不是通过使用 new 关键字直接实例化对象。工厂模式将对象的创建过程封装起来,使代码更灵活且易于扩展。工厂模式可以分为以下几种类型:

  1. 简单工厂模式(Simple Factory Pattern):并不属于 GoF(四人帮)设计模式中的一种,但也是一种常用的模式。简单工厂通过一个工厂类来决定实例化哪一个具体类,通常是通过传递参数来决定。

  2. 工厂方法模式(Factory Method Pattern):定义一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法使得类的实例化延迟到子类。

  3. 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

下面我们主要讨论 工厂方法模式,并提供相关代码示例。

工厂方法模式

工厂方法模式 是一种设计模式,它定义了一个创建对象的接口,但允许子类决定实例化哪个类。工厂方法让类的实例化推迟到子类,这样代码的扩展性和灵活性就得到了提高。

关键点:
  • 抽象产品类(Product):定义了工厂方法所创建的对象的接口。
  • 具体产品类(ConcreteProduct):实现了抽象产品接口的具体类。
  • 抽象工厂类(Creator):声明了返回对象的工厂方法。
  • 具体工厂类(ConcreteCreator):实现了工厂方法,返回具体产品实例。

工厂方法模式的示例代码

假设我们需要创建一个关于不同类型日志记录器的系统,日志记录器可能是文件日志记录器、数据库日志记录器等。我们使用工厂方法模式来设计这个系统。

代码示例
cpp 复制代码
#include <iostream>
#include <memory>

// 抽象产品类:日志记录器接口
class Logger {
public:
    virtual void log(const std::string& message) = 0;
    virtual ~Logger() {}
};

// 具体产品类:文件日志记录器
class FileLogger : public Logger {
public:
    void log(const std::string& message) override {
        std::cout << "Logging to a file: " << message << std::endl;
    }
};

// 具体产品类:数据库日志记录器
class DatabaseLogger : public Logger {
public:
    void log(const std::string& message) override {
        std::cout << "Logging to a database: " << message << std::endl;
    }
};

// 抽象工厂类:日志记录器工厂接口
class LoggerFactory {
public:
    virtual std::unique_ptr<Logger> createLogger() = 0;
    virtual ~LoggerFactory() {}
};

// 具体工厂类:文件日志记录器工厂
class FileLoggerFactory : public LoggerFactory {
public:
    std::unique_ptr<Logger> createLogger() override {
        return std::make_unique<FileLogger>();
    }
};

// 具体工厂类:数据库日志记录器工厂
class DatabaseLoggerFactory : public LoggerFactory {
public:
    std::unique_ptr<Logger> createLogger() override {
        return std::make_unique<DatabaseLogger>();
    }
};

// 客户端代码
int main() {
    // 创建一个文件日志记录器工厂
    std::unique_ptr<LoggerFactory> fileLoggerFactory = std::make_unique<FileLoggerFactory>();
    // 通过工厂创建日志记录器
    std::unique_ptr<Logger> logger = fileLoggerFactory->createLogger();
    // 使用日志记录器记录信息
    logger->log("File log message");

    // 创建一个数据库日志记录器工厂
    std::unique_ptr<LoggerFactory> dbLoggerFactory = std::make_unique<DatabaseLoggerFactory>();
    // 通过工厂创建日志记录器
    logger = dbLoggerFactory->createLogger();
    // 使用日志记录器记录信息
    logger->log("Database log message");

    return 0;
}

代码分析

  • Logger:抽象产品类,定义了日志记录器的接口。
  • FileLoggerDatabaseLogger :具体产品类,实现了 Logger 接口的具体日志记录器。
  • LoggerFactory:抽象工厂类,声明了创建日志记录器的工厂方法。
  • FileLoggerFactoryDatabaseLoggerFactory:具体工厂类,实现了创建具体日志记录器的工厂方法。

优点:

  • 可扩展性好:在新增日志记录器时,只需要添加新的具体产品类和对应的具体工厂类,而不需要修改已有代码,符合开闭原则。
  • 封装性好:工厂方法将对象的创建过程封装在工厂类中,客户端不需要关心具体产品的创建过程。

适用场景:

  • 当一个类不知道它需要创建的对象的具体类型时。
  • 当一个类希望由其子类来指定它所创建的对象时。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并希望将哪一个子类是委托类的职责局部化时。

工厂模式通过将对象的创建过程封装在工厂类中,使代码更易于扩展和维护,是设计模式中非常重要的一种。

相关推荐
workflower3 小时前
人形机器人灵巧手产业链
人工智能·设计模式·机器人·云计算·无人机
Java后端的Ai之路4 小时前
03、Python - 抽象工厂模式
开发语言·python·设计模式·抽象工厂模式·通用智慧
AI人工智能+电脑小能手9 小时前
大白话说Java设计模式-45-解释器模式(源码剖析篇)
java·设计模式·解释器模式·源码分析·pattern·spel·javacc
码匠许师傅13 小时前
【设计模式精讲】4.单例模式(Singleton)
c++·单例模式·设计模式
雾削木14 小时前
2026 编程领域热点知识速览:AI 辅助开发、设计模式实战与嵌入式高效迭代
人工智能·设计模式
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-42-访问者模式(业务实战篇)
java·spring·设计模式·访问者模式·asm·营销规则·数据结构与操作分离
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-43-访问者模式(源码剖析篇)
java·设计模式·访问者模式·源码分析·elementvisitor·asm classvisitor·spring spel
Michael_lcf2 天前
Agent设计模式:思考-行动-观察循环的本质与局限
设计模式·agent设计模式·agent设计模式的本质
丰锋ff2 天前
设计模式学习笔记
笔记·学习·设计模式
米啦啦.2 天前
设计模式/
观察者模式·单例模式·设计模式·工厂模式