设计模式 | 原型模式

定义

原型设计模式(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` 的名称并输出变化。

相关推荐
是2的10次方啊9 小时前
设计模式与生活①:你的脸,为什么不能有第二个?
设计模式
高晶11 小时前
ARM 嵌入式 Linux 命令系统 BusyBox 实战指南
linux·设计模式·程序员
高晶11 小时前
语音合成与变声技术十大业务场景落地实战:从电商直播到规模化生产
设计模式·程序员
博风14 小时前
19、设计模式应用举例:桥接模式:制作电视节目
设计模式·桥接模式
知守观14 小时前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式
geovindu1 天前
rust: Mediator Pattern
开发语言·后端·设计模式·rust·中介者模式·行为模式
SENKS_DIGITAL2 天前
金属加工遇上数字化:通快展厅里的工业蜕变-森克思科技
科技·设计模式·展厅设计·展馆设计·科技展厅设计·展览设计·企业展厅设计
flower9803232 天前
C++消息总线软件开发框架AI重构版
c++·设计模式·架构
zzu123zsw3 天前
业务拆分后的治理深水区:解构企业级微服务六大核心设计模式与高可用落真实践
微服务·设计模式·架构·高可用·微服务架构设计
牧瀬クリスだ3 天前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式