设计模式 | 原型模式

定义

原型设计模式(Prototype Pattern)是一种创建型设计模式,它通过复制已有对象来创建新对象,而不是通过构造函数。这种模式适用于需要大量相似对象的情况,避免了重复的初始化工作。

原型模式的核心思想是通过一个原型实例来生成新的对象。通常,一个类会实现一个接口,该接口定义了一个克隆方法,用于复制其自身。

应用场景

  1. 对象创建成本较高 :当创建对象的代价很大时,可以通过复制现有对象来减少开销。

  2. 需要动态生成对象 :在运行时动态生成多个相似对象,例如游戏中的角色、复杂模型等。

  3. 替代构造函数 :在无法确定创建对象的类时,可以使用原型模式进行对象创建。

  4. 减少类的数量:通过复制对象,可以减少需要定义的类的数量,方便管理。

实例分享

cpp 复制代码
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>

class Prototype {
  public:
    Prototype() = default;
    Prototype(const std::string& name) : name_(name) {}
    virtual ~Prototype() = default;

    virtual std::unique_ptr<Prototype> clone() const = 0;
    virtual void show() const = 0;

  protected:
    std::string getName() const {
      return name_;
    }
  
  private:
    std::string name_;
};

class ConcretePrototype1 : public Prototype {
  public:
    ConcretePrototype1(const std::string& name, int value1)
       : value1_(value1), Prototype(name) {}

    std::unique_ptr<Prototype> clone() const override {
      return std::make_unique<ConcretePrototype1>(*this);
    }

    void show() const override {
      std::cout << "ConcretePtototype obj:" << this << " name:" << getName()
                << "  value:" << value1_ << std::endl;
    }
  
  private:
    int value1_;
};

class ConcretePrototype2 : public Prototype {
  public:
    ConcretePrototype2(const std::string& name, int value2)
       : value2_(value2), Prototype(name) {}

    std::unique_ptr<Prototype> clone() const override {
      return std::make_unique<ConcretePrototype2>(*this);
    }

    void show() const override {
      std::cout << "ConcretePtototype obj:" << this << " name:" << getName()
                << "  value:" << value2_ << std::endl;
    }

  private:
    int value2_;
};


int main() {
  // Create a prototype object, and clone the original prototype object. Then they have the
  // same object address(only clone).
  auto ori_concrete_obj1 = std::make_unique<ConcretePrototype1>("ConcreteProtoType_01", 100);
  auto clone_obj1_1 = ori_concrete_obj1->clone();
  auto clone_obj1_2 = ori_concrete_obj1->clone();
  ori_concrete_obj1->show();
  clone_obj1_1->show();
  clone_obj1_2->show();
  /**
   * ConcretePtototype obj:0x55f3e65ede90 name:ConcreteProtoType_01  value:100
   * ConcretePtototype obj:0x55f3e65edef0 name:ConcreteProtoType_01  value:100
   * ConcretePtototype obj:0x55f3e65edf30 name:ConcreteProtoType_01  value:100
   */

  clone_obj1_1 = std::make_unique<ConcretePrototype1>("Updated_ConcreteProtoType_01", 120);
  ori_concrete_obj1->show();
  clone_obj1_1->show();
  clone_obj1_2->show();
  /**
   * ConcretePtototype obj:0x55f3e65ede90 name:ConcreteProtoType_01  value:100
   * ConcretePtototype obj:0x55f3e65ee3f0 name:Updated_ConcreteProtoType_01  value:120
   * ConcretePtototype obj:0x55f3e65edf30 name:ConcreteProtoType_01  value:100
   */

  return 0;
}

代码分析

  1. 原型接口(Prototype):
  • 声明了一个克隆方法 `clone` 和一个显示方法 `show`。
  1. 具体原型类(ConcretePrototype):
  • 实现了 `clone` 方法,返回自身的克隆(使用 `std::make_unique` 创建新的对象)。

  • 实现了 `show` 方法,输出对象的名称。

  1. 客户端代码(main 函数):
  • 创建了一个原型对象 `original`。

  • 通过调用 `clone` 方法生成两个克隆对象 `clone1` 和 `clone2`。

  • 显示原型对象及其克隆的名称。

  • 修改 `clone1` 的名称并输出变化。

相关推荐
tobias.b3 小时前
软件设计模式:核心术语·名词解释·关联对比
设计模式
hnlgzb8 小时前
目前编写安卓app的话有哪几种设计模式?
android·设计模式·kotlin·android jetpack·compose
pedestrian_h10 小时前
Java单例模式回顾
java·单例模式·设计模式
饼干哥哥10 小时前
这10个n8n工作流,直接干死了90%的Tiktok视频生产,一键直出100条
设计模式
砍光二叉树11 小时前
【设计模式】行为型-命令模式
设计模式·命令模式
程序员小寒11 小时前
JavaScript设计模式(六):职责链模式实现与应用
java·javascript·设计模式
无籽西瓜a12 小时前
【西瓜带你学设计模式 | 第五期 - 建造者模式】建造者模式 —— 产品构建实现、优缺点与适用场景及模式区别
java·后端·设计模式·软件工程·建造者模式
木斯佳12 小时前
前端八股文面经大全:字节跳动前端一面·深度解析(Plus Ultra版)(2026-03-30)·面经深度解析
前端·设计模式·八股·光栅化
砍光二叉树13 小时前
【设计模式】行为型-责任链模式
java·设计模式·责任链模式
无籽西瓜a13 小时前
【西瓜带你学设计模式 | 第七期 - 适配器模式】适配器模式 —— 类适配器与对象适配器实现、优缺点与适用场景
java·后端·设计模式·软件工程·适配器模式