设计模式 | 原型模式

定义

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

相关推荐
静水流深_沧海一粟16 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder16 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室1 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo5 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4965 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃5 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20105 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈5 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||5 天前
安装依赖三方exe/msi的软件设计模式
设计模式