一、简介工厂模式Factory Pattern是创建型设计模式的核心成员其核心思想是将对象的创建逻辑封装起来让子类决定实例化哪一个类从而使一个类的实例化延迟到子类。它能有效降低代码耦合度提高系统的可扩展性和可维护性通过使用工厂模式可以将对象的创建逻辑封装在一个工厂类中而不是在客户端代码中直接实例化对象这样可以提高代码的可维护性和可扩展性。二、三种形态1.简单工厂模式特点 一个单独的工厂类根据参数创建不同产品适用场景产品类型较少且不常变化典型应用工具类示例#include iostream #include memory #include string // 1. 抽象产品 class Car { public: virtual ~Car() default; virtual void run() 0; }; // 2. 具体产品 class Benz : public Car { public: void run() override { std::cout Benz is running... std::endl; } }; class BMW : public Car { public: void run() override { std::cout BMW is running... std::endl; } }; // 3. 简单工厂 class CarFactory { public: enum class CarType { BENZ, BMW }; // 静态工厂方法 static std::unique_ptrCar createCar(CarType type) { switch (type) { case CarType::BENZ: return std::make_uniqueBenz(); case CarType::BMW: return std::make_uniqueBMW(); default: throw std::invalid_argument(Unknown car type); } } }; // 4. 客户端使用 int main() { auto car1 CarFactory::createCar(CarFactory::CarType::BENZ); auto car2 CarFactory::createCar(CarFactory::CarType::BMW); car1-run(); car2-run(); return 0; }2.工厂方法模式特点定义创建接口由子类决定实例化哪个类适用场景单一产品等级结构需要扩展新产品典型应用框架扩展点示例#include iostream #include memory #include string // 1. 抽象产品 class Logger { public: virtual ~Logger() default; virtual void log(const std::string msg) 0; }; // 2. 具体产品 class ConsoleLogger : public Logger { public: void log(const std::string msg) override { std::cout [Console] msg std::endl; } }; class FileLogger : public Logger { public: void log(const std::string msg) override { std::cout [File] msg std::endl; // 简化示例 } }; // 3. 抽象工厂创建者 class LoggerFactory { public: virtual ~LoggerFactory() default; virtual std::unique_ptrLogger createLogger() 0; // 模板方法通用的日志记录流程 void logMessage(const std::string msg) { auto logger createLogger(); logger-log(msg); } }; // 4. 具体工厂 class ConsoleLoggerFactory : public LoggerFactory { public: std::unique_ptrLogger createLogger() override { return std::make_uniqueConsoleLogger(); } }; class FileLoggerFactory : public LoggerFactory { public: std::unique_ptrLogger createLogger() override { return std::make_uniqueFileLogger(); } }; // 5. 客户端 int main() { std::unique_ptrLoggerFactory factory; // 可根据配置/环境变量切换 factory std::make_uniqueConsoleLoggerFactory(); factory-logMessage(Hello Console!); factory std::make_uniqueFileLoggerFactory(); factory-logMessage(Hello File!); return 0; }3.抽象工厂模式特点提供一个创建一系列相关或互相依赖对象的接口而无需指定它们具体的类适用场景需要创建多个产品族如跨平台UI典型应用跨平台/主题示例#include iostream #include memory // 抽象产品 A class Button { public: virtual ~Button() default; virtual void render() 0; }; // 抽象产品 B class TextBox { public: virtual ~TextBox() default; virtual void input() 0; }; // 具体产品Windows class WinButton : public Button { public: void render() override { std::cout Render Windows Button std::endl; } }; class WinTextBox : public TextBox { public: void input() override { std::cout Windows TextBox Input std::endl; } }; // 具体产品Mac class MacButton : public Button { public: void render() override { std::cout Render Mac Button std::endl; } }; class MacTextBox : public TextBox { public: void input() override { std::cout Mac TextBox Input std::endl; } }; // 抽象工厂 class UIFactory { public: virtual ~UIFactory() default; virtual std::unique_ptrButton createButton() 0; virtual std::unique_ptrTextBox createTextBox() 0; }; // 具体工厂Windows class WinUIFactory : public UIFactory { public: std::unique_ptrButton createButton() override { return std::make_uniqueWinButton(); } std::unique_ptrTextBox createTextBox() override { return std::make_uniqueWinTextBox(); } }; // 具体工厂Mac class MacUIFactory : public UIFactory { public: std::unique_ptrButton createButton() override { return std::make_uniqueMacButton(); } std::unique_ptrTextBox createTextBox() override { return std::make_uniqueMacTextBox(); } }; // 客户端 void renderUI(UIFactory factory) { auto button factory.createButton(); auto textBox factory.createTextBox(); button-render(); textBox-input(); } int main() { // 根据系统环境切换 WinUIFactory winFactory; renderUI(winFactory); std::cout ---------\n; MacUIFactory macFactory; renderUI(macFactory); return 0; }