C++ 设计模式:原型模式(Prototype Pattern)

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

原型模式(Prototype Pattern)是一种创建型设计模式,它允许一个对象通过复制现有对象来创建新对象,而不是通过实例化类来创建对象。原型模式通过克隆现有对象来避免复杂的初始化过程,从而提高对象创建的效率。

1.问题分析

在开发中,有时我们需要创建大量相似的对象,这些对象的创建过程可能非常复杂,涉及大量的初始化步骤和资源分配。每次通过构造函数创建新对象可能会导致性能问题和代码冗余。为了提高效率和简化代码,我们可以使用原型模式。

2.实现步骤

  1. 定义原型接口:定义一个包含克隆方法的接口,所有需要克隆的对象都应该实现这个接口。
  2. 实现具体原型类:实现具体的原型类,这些类需要实现克隆方法,以便能够复制自身。
  3. 使用原型创建对象:通过调用原型对象的克隆方法来创建新对象,而不是通过构造函数创建新对象。

3.代码示例

3.1.定义原型接口

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

3.2.实现具体原型类

cpp 复制代码
// 具体机器人A
class CleaningRobot : public Robot {
 public:
  std::unique_ptr<Robot> clone() const override { return std::make_unique<CleaningRobot>(*this); }

  void performTask() const override { std::cout << "CleaningRobot is cleaning the floor." << std::endl; }
};
cpp 复制代码
// 具体机器人B
class CookingRobot : public Robot {
 public:
  std::unique_ptr<Robot> clone() const override { return std::make_unique<CookingRobot>(*this); }

  void performTask() const override { std::cout << "CookingRobot is cooking a meal." << std::endl; }
};

3.3.使用原型创建对象

cpp 复制代码
// 客户端类
class RobotManager {
 public:
  RobotManager(const Robot* prototype) : prototype_(prototype) {}

  void manageRobot() const {
    if (prototype_) {
      std::unique_ptr<Robot> robot = prototype_->clone();
      robot->performTask();
    } else {
      std::cerr << "Error: No prototype provided." << std::endl;
    }
  }

 private:
  const Robot* prototype_;
};

3.4. 客户端代码

cpp 复制代码
int main() {
  // 创建具体的机器人对象
  std::unique_ptr<Robot> cleaningPrototype = std::make_unique<CleaningRobot>();
  std::unique_ptr<Robot> cookingPrototype = std::make_unique<CookingRobot>();

  // 创建RobotManager并传递原型对象的指针
  RobotManager cleaningManager(cleaningPrototype.get());
  cleaningManager.manageRobot();

  RobotManager cookingManager(cookingPrototype.get());
  cookingManager.manageRobot();

  return 0;
}

4.总结

原型模式与工厂方法模式的对比:

  • 原型模式

    1. 对象创建方式:通过克隆现有的原型对象来创建新对象。
    2. 适用场景 :
      • 对象的构造初始化过程复杂。
      • 需要大量相似对象。
      • 性能要求高,通过克隆现有对象比通过构造函数创建对象更高效。
    3. 优点 :
      • 避免了复杂的初始化过程。
      • 可以在运行时动态改变被复制的对象。
      • 提供了简化的对象创建方式。
    4. 缺点 :
      • 需要实现克隆方法,可能涉及深拷贝和浅拷贝的问题。
      • 对象的克隆过程可能比较复杂。
  • 工厂方法模式

    1. 对象创建方式:通过工厂方法创建新对象,通常是通过构造函数进行初始化。
    2. 适用场景 :
      • 需要创建不同类型的对象。
      • 对象创建过程相对简单。
    3. 优点 :
      • 提供了创建对象的接口,子类可以决定实例化哪一个类。
      • 遵循开闭原则,可以通过添加新的子类来扩展产品。
    4. 缺点 :
      • 每次调用工厂方法时,都会创建一个新的对象,可能涉及复杂的初始化过程。
      • 需要为每种产品创建相应的工厂类,增加了代码的复杂性。
相关推荐
进化中的刀盾兽2 小时前
从零实现 C++ Json-Rpc(十):把消息交给真实连接——MuduoConnection 与 ConnectionFactory
c++·rpc
青瓦梦滋8 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
CodeYp201914 小时前
第15讲:二叉搜索树
开发语言·c++·二叉搜索树
pipixia2003314 小时前
C++继承面试四连问:内存叠加、私有继承、sizeof、权限重映射
c++·面试·嵌入式·继承·面向对象·对象模型
昭昭日月明15 小时前
AI 时代的《重构》
设计模式·架构
牵猫散步的鱼儿17 小时前
C++ 内存分区
c++
choumin17 小时前
C++ 标准容器为什么不能存引用
c++·容器·引用类型
谙弆悕博士18 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室
stolentime18 小时前
CF2277E Tree Guessing题解
c++·算法·贪心算法·交互·ad-hoc
syagain_zsx19 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节