原型模式(附C++代码示例)

本文介绍了原型模式,一种通过复制已存在的对象创建新对象的设计模式。它强调了克隆的高效性和灵活性,尤其是在图形编辑等场景中。示例代码展示了如何使用unique_ptr管理内存,复制复杂对象并保持资源安全。
摘要由CSDN通过智能技术生成

原型模式的含义

原型模式(Prototype Pattern)是一种创建型设计模式,使得创建新对象的方式是通过复制已存在的对象,并通过克隆操作来创建新对象。在这种模式中,新创建的对象是对原型对象的一个完整拷贝。

核心思想及解释

原型模式的核心思想是基于已存在的对象通过克隆来创建新对象,而不是重新初始化一个新对象。这种方式特别适用于创建复杂对象的情形,因为它使得创建对象更为高效,可以避免创建对象时的重复初始化过程。

为什么要使用原型模式

  1. 效率高: 当直接创建对象的成本比较高时,使用原型模式可以减少资源消耗、提高性能。
  2. 避免构造约束: 使用克隆避免了与使用new关键字时必须调用构造函数的约束。
  3. 动态增加或减少产品类: 原型模式允许在运行时通过注册和删除原型来动态改变可用的产品种类。

使用原型模式需要注意的点

  1. 实现克隆操作: 确保正确实现克隆(浅拷贝/深拷贝)方法,特别是当对象结构复杂或对象间存在递归引用时。
  2. 克隆与外部状态: 使用原型模式时,需要注意克隆对象的独立性,确保克隆对象的改变不会影响到原型对象。

工程的应用场景

  1. 当创建复杂对象的成本较高时: 如对象的创建涉及到复杂的数据库操作、网络请求或复杂计算。
  2. 系统要独立于它的产品创建、构成和表示时: 当系统需要与产品类的具体实现解耦,并且要求动态地操作多个预生成的实例时。
  3. 当类的实例只能有几个不同状态组合中的一种时: 使用原型模式可以预先创建一个对应每种状态组合的原型集合。

示例代码及解释

假设我们有一个用于图形编辑的应用,需要频繁创建图形对象。每个图形对象的初始化可能涉及复杂的准备工作,如加载图像、设置环境参数等。

定义图形接口和具体的图形类:

#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管理内存,保证资源安全。通过这种方式,可以非常方便地复制复杂的对象。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warren++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值