设计模式 | 原型模式

定义

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

相关推荐
小白不太白9505 小时前
设计模式之 模板方法模式
java·设计模式·模板方法模式
色空大师6 小时前
23种设计模式
java·开发语言·设计模式
闲人一枚(学习中)6 小时前
设计模式-创建型-建造者模式
java·设计模式·建造者模式
博风7 小时前
设计模式:6、装饰模式(包装器)
设计模式
A_cot7 小时前
理解设计模式与 UML 类图:构建稳健软件架构的基石
microsoft·设计模式·简单工厂模式·工厂方法模式·uml
君败红颜7 小时前
设计模式之创建模式篇
设计模式
闲人一枚(学习中)10 小时前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
小白不太白95012 小时前
设计模式之 观察者模式
观察者模式·设计模式
小白不太白95013 小时前
设计模式之 责任链模式
python·设计模式·责任链模式
吾与谁归in14 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式