原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。
一、源型模式的定义
原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。
📌 核心特点:
-
避免重复初始化操作(尤其是复杂对象)
-
动态添加或删除产品类
-
隐藏对象创建的细节
其UML类图如下所示:
类名 | 作用 |
---|---|
Client |
客户端,通过原型接口克隆对象 |
Prototype |
抽象原型接口,声明clone() 方法 |
ConcretePrototypeA/B |
具体原型类,实现深拷贝逻辑 |
二、源型模式的适用场景
✅ 适用场景:
-
对象创建成本高(如数据库查询结果、复杂计算对象)
-
需要动态配置的对象(如游戏中的敌人、武器生成)
-
需要避免构造函数的约束(如深拷贝复杂对象)
❌ 不适用场景:
-
对象结构过于简单(直接
new
更高效) -
需要强类型控制的场景
2.1、基础实现
#include <iostream>
#include <memory>
// 抽象原型类
class Prototype {
public:
virtual ~Prototype() = default;
virtual std::unique_ptr<Prototype> clone() const = 0; // 克隆方法
virtual void print() const = 0;
};
// 具体原型类A
class ConcretePrototypeA : public Prototype {
public:
std::unique_ptr<Prototype> clone() const override {
return std::make_unique<ConcretePrototypeA>(*this); // 调用拷贝构造
}
void print() const override {
std::cout << "ConcretePrototypeA" << std::endl;
}
};
// 具体原型类B
class ConcretePrototypeB : public Prototype {
public:
std::unique_ptr<Prototype> clone() const override {
return std::make_unique<ConcretePrototypeB>(*this);
}
void print() const override {
std::cout << "ConcretePrototypeB" << std::endl;
}
};
// 客户端代码
int main() {
std::unique_ptr<Prototype> originalA = std::make_unique<ConcretePrototypeA>();
std::unique_ptr<Prototype> cloneA = originalA->clone();
cloneA->print(); // 输出: ConcretePrototypeA
std::unique_ptr<Prototype> originalB = std::make_unique<ConcretePrototy