模式特点
定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
- 客户端不需要知道具体产品类的类名
- 新增产品时只需新增对应工厂,符合开闭原则
- 将对象的创建和使用分离
类图
应用场景
- Qt 中 QStyleFactory 根据平台创建不同风格
- 跨平台 UI 组件创建(Windows/Linux/Mac 不同控件)
- 日志记录器:根据配置创建文件日志或控制台日志
- 数据库访问层:不同数据库的连接创建
- 序列化/反序列化:根据类型创建不同对象
示例代码(C++)
// 抽象产品 class Connection { public: virtual ~Connection() = default; virtual void connect() = 0; }; // 具体产品 class MySQLConnection : public Connection { public: void connect() override { std::cout << "MySQL connected" << std::endl; } }; class SQLiteConnection : public Connection { public: void connect() override { std::cout << "SQLite connected" << std::endl; } }; // 抽象工厂 class ConnectionFactory { public: virtual Connection* createConnection() = 0; virtual ~ConnectionFactory() = default; }; // 具体工厂 class MySQLFactory : public ConnectionFactory { public: Connection* createConnection() override { return new MySQLConnection(); } };