C++ 设计模式:工厂方法(Factory Method)

链接:C++ 设计模式
链接:C++ 设计模式 - 抽象工厂
链接:C++ 设计模式 - 原型模式
链接:C++ 设计模式 - 建造者模式

工厂方法(Factory Method)是创建型设计模式之一,它提供了一种创建对象的接口,但由子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到其子类。

1.问题分析

在面向对象编程中,我们经常需要创建对象,但具体的对象类型在编译时并不确定,可能会在运行时根据不同的条件进行选择。如果直接在代码中使用 new 关键字来创建对象,会导致代码的耦合度高,难以维护和扩展。

工厂方法模式通过定义一个创建对象的接口,将对象的实例化延迟到子类,从而使得代码更加灵活和可扩展。

2.实现步骤

  1. 定义产品接口:定义一个接口或抽象类,描述产品的公共接口。
  2. 实现具体产品:实现具体产品类,提供不同的产品实现。
  3. 定义工厂接口:定义一个创建产品对象的接口。
  4. 实现具体工厂:实现具体工厂类,这些类实现了工厂接口,并负责实例化具体的产品对象。
  5. 创建客户端类:创建一个客户端类,使用工厂接口来创建产品对象,并管理它们的行为。
  6. 客户端代码:创建具体的工厂对象,并将其传递给客户端类,调用客户端类的方法来管理产品对象。

3.代码示例

以机器人作为示例。

3.1.定义产品接口

cpp 复制代码
// 机器人接口
class Robot {
 public:
  virtual ~Robot() = default;
  virtual void performTask() const = 0;
};

3.2.实现具体产品

cpp 复制代码
// 具体机器人A
class CleaningRobot : public Robot {
 public:
  void performTask() const override { std::cout << "CleaningRobot is cleaning the floor." << std::endl; }
};
cpp 复制代码
// 具体机器人B
class CookingRobot : public Robot {
 public:
  void performTask() const override { std::cout << "CookingRobot is cooking a meal." << std::endl; }
};

3.3.定义工厂接口

cpp 复制代码
// 工厂接口
class RobotFactory {
 public:
  virtual ~RobotFactory() = default;
  virtual std::unique_ptr<Robot> createRobot() const = 0;
};

3.4.实现具体工厂

cpp 复制代码
// 具体工厂A,负责创建具体机器人A
class CleaningRobotFactory : public RobotFactory {
 public:
  std::unique_ptr<Robot> createRobot() const override { return std::make_unique<CleaningRobot>(); }
};
cpp 复制代码
// 具体工厂B,负责创建具体机器人B
class CookingRobotFactory : public RobotFactory {
 public:
  std::unique_ptr<Robot> createRobot() const override { return std::make_unique<CookingRobot>(); }
};

3.5.创建客户端类

cpp 复制代码
// 客户端类
class RobotManager {
 public:
  RobotManager(std::unique_ptr<RobotFactory> factory) : factory_(std::move(factory)) {}

  void manageRobot() const {
    std::unique_ptr<Robot> robot = factory_->createRobot();
    robot->performTask();
  }

 private:
  std::unique_ptr<RobotFactory> factory_;
};

3.6.客户端代码

cpp 复制代码
int main() {
  std::unique_ptr<RobotFactory> cleaningFactory = std::make_unique<CleaningRobotFactory>();
  RobotManager cleaningManager(std::move(cleaningFactory));
  cleaningManager.manageRobot();

  std::unique_ptr<RobotFactory> cookingFactory = std::make_unique<CookingRobotFactory>();
  RobotManager cookingManager(std::move(cookingFactory));
  cookingManager.manageRobot();

  return 0;
}

4.总结

在这个示例中,RobotManager类使用了工厂方法来创建机器人对象,并管理它们的行为。这样,客户端代码只需要与RobotManager和工厂接口交互,而不需要知道具体的机器人类,从而实现了更好的解耦和扩展性。

抽象工厂与工厂方法的区别:

  • 工厂方法:关注的是单个产品对象的创建。它通过定义一个创建对象的接口,让子类决定实例化哪一个具体类。
  • 抽象工厂:关注的是一组相关或相互依赖的产品对象的创建。它通过定义一个创建一系列相关产品对象的接口,让具体工厂类实现这些接口来创建具体的产品对象。
相关推荐
喝拿铁写前端11 分钟前
从面条代码到抽象能力:一个小表单场景里的前端成长四阶段
前端·设计模式·架构
依米_24 分钟前
一文带你剖析 Promise.then all 实现原理,状态机、发布订阅模式完美实现异步编程
javascript·设计模式
jzhwolp2 小时前
从基本链表到侵入式链表,体会内核设计思路
c语言·后端·设计模式
爱凤的小光2 小时前
图漾GM461-E1相机专栏
c++
qwepoilkjasd3 小时前
C++智能指针介绍
c++
·白小白3 小时前
力扣(LeetCode) ——43.字符串相乘(C++)
c++·leetcode
咬_咬3 小时前
C++仿muduo库高并发服务器项目:Poller模块
服务器·开发语言·c++·epoll·muduo
FMRbpm4 小时前
链表5--------删除
数据结构·c++·算法·链表·新手入门
Kimser5 小时前
QT C++ QWebEngine与Web JS之间通信
javascript·c++·qt
QT 小鲜肉5 小时前
【QT/C++】Qt样式设置之CSS知识(系统性概括)
linux·开发语言·css·c++·笔记·qt