欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 设计模式 | 原型模式

设计模式 | 原型模式

2025/2/28 9:46:46 来源:https://blog.csdn.net/qq_38844835/article/details/141936713  浏览:    关键词:设计模式 | 原型模式

定义

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

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

应用场景

1. 对象创建成本较高:当创建对象的代价很大时,可以通过复制现有对象来减少开销。
2. 需要动态生成对象:在运行时动态生成多个相似对象,例如游戏中的角色、复杂模型等。
3. 替代构造函数:在无法确定创建对象的类时,可以使用原型模式进行对象创建。
4. 减少类的数量:通过复制对象,可以减少需要定义的类的数量,方便管理。

实例分享

#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`。

2. 具体原型类(ConcretePrototype):
   - 实现了 `clone` 方法,返回自身的克隆(使用 `std::make_unique` 创建新的对象)。
   - 实现了 `show` 方法,输出对象的名称。

3. 客户端代码(main 函数):
   - 创建了一个原型对象 `original`。
   - 通过调用 `clone` 方法生成两个克隆对象 `clone1` 和 `clone2`。
   - 显示原型对象及其克隆的名称。
   - 修改 `clone1` 的名称并输出变化。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词