原型模式的含义
原型模式(Prototype Pattern)是一种创建型设计模式,使得创建新对象的方式是通过复制已存在的对象,并通过克隆操作来创建新对象。在这种模式中,新创建的对象是对原型对象的一个完整拷贝。
核心思想及解释
原型模式的核心思想是基于已存在的对象通过克隆来创建新对象,而不是重新初始化一个新对象。这种方式特别适用于创建复杂对象的情形,因为它使得创建对象更为高效,可以避免创建对象时的重复初始化过程。
为什么要使用原型模式
- 效率高: 当直接创建对象的成本比较高时,使用原型模式可以减少资源消耗、提高性能。
- 避免构造约束: 使用克隆避免了与使用
new
关键字时必须调用构造函数的约束。 - 动态增加或减少产品类: 原型模式允许在运行时通过注册和删除原型来动态改变可用的产品种类。
使用原型模式需要注意的点
- 实现克隆操作: 确保正确实现克隆(浅拷贝/深拷贝)方法,特别是当对象结构复杂或对象间存在递归引用时。
- 克隆与外部状态: 使用原型模式时,需要注意克隆对象的独立性,确保克隆对象的改变不会影响到原型对象。
工程的应用场景
- 当创建复杂对象的成本较高时: 如对象的创建涉及到复杂的数据库操作、网络请求或复杂计算。
- 系统要独立于它的产品创建、构成和表示时: 当系统需要与产品类的具体实现解耦,并且要求动态地操作多个预生成的实例时。
- 当类的实例只能有几个不同状态组合中的一种时: 使用原型模式可以预先创建一个对应每种状态组合的原型集合。
示例代码及解释
假设我们有一个用于图形编辑的应用,需要频繁创建图形对象。每个图形对象的初始化可能涉及复杂的准备工作,如加载图像、设置环境参数等。
定义图形接口和具体的图形类:
#include <iostream>
#include <memory>
using namespace std;
// 图形接口
class Graphic {
public:
virtual void draw() const = 0;
virtual unique_ptr<Graphic> clone() const = 0;
virtual ~Graphic() {}
};
// 具体图形类:圆形
class Circle : public Graphic
{
public:
Circle(float r) : radius(r) {}
void draw() const override {
cout << "Circle with radius: " << radius << endl;
}
unique_ptr<Graphic> clone() const override {
return make_unique<Circle>(*this);
}
private:
float radius;
};
客户端代码:
int main() {
unique_ptr<Graphic> circle = make_unique<Circle>(10.0);
circle->draw();
// 克隆圆形对象
unique_ptr<Graphic> anotherCircle = circle->clone();
anotherCircle->draw();
return 0;
}
输出代码运行结果
Circle with radius: 10
Circle with radius: 10
这个示例展示了原型模式的基本用法,其中通过克隆方法创建了一个圆形对象的副本,而无需通过new
关键字直接构造一个新对象。使用unique_ptr
管理内存,保证资源安全。通过这种方式,可以非常方便地复制复杂的对象。