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