C++ 设计模式之原型模式

【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】

【简介】什么是原型模式

        原型模式⼀种创建型设计模式,该模式的核⼼思想是基于现有的对象创建新的对象,⽽不是从头开始创建。在原型模式中,通常有⼀个原型对象,它被⽤作创建新对象的模板。新对象通过复制原型对象的属性和状态来创建,⽽⽆需知道具体的创建细节。


【应用场景】

        如果⼀个对象的创建过程⽐较复杂时(⽐如需要经过⼀系列的计算和资源消耗),那每次创建该对象都需要消耗资源,⽽通过原型模式就可以复制现有的⼀个对象来迅速创建/克隆⼀个新对象,不必关⼼具体的创建细节,可以降低对象创建的成本

        相⽐于直接实例化对象,通过原型模式复制对象可以减少资源消耗,提⾼性能,尤其在对象的创建过程复杂或对象的创建代价较⼤的情况下。当需要频繁创建相似对象、并且可以通过克隆避免重复初始化⼯作的场景时可以考虑使⽤原型模式,在克隆对象的时候还可以动态地添加或删除原型对象的属性,创造出相似但不完全相同的对象,提⾼了灵活性。
        但是使⽤原型模式也需要考虑到如果对象的内部状态包含了引⽤类型的成员变量,那么实现深拷⻉就会变得较为复杂,需要考虑引⽤类型对象的克隆问题


【基本结构】

        实现原型模式需要给【原型对象】声明⼀个克隆⽅法,执⾏该⽅法会创建⼀个当前类的新对象,并将原始对象中的成员变量复制到新⽣成的对象中,⽽不必实例化。并且在这个过程中只需要调⽤原型对象的克隆⽅法,⽽⽆需知道原型对象的具体类型。
        原型模式包含两个重点模块:

  • 抽象原型接⼝prototype : 声明⼀个克隆⾃身的⽅法clone
  • 具体原型类ConcretePrototype : 实现clone ⽅法,复制当前对象并返回⼀个新对象。

        在客户端代码中,可以声明⼀个具体原型类的对象,然后调⽤clone() ⽅法复制原对象⽣成⼀个新的对象。


【实现流程】

        原型模式的实现过程即上⾯描述模块的实现过程:

  • 创建⼀个抽象类或接⼝,声明⼀个克隆⽅法clone
  • 实现具体原型类,重写克隆⽅法
  • 客户端中实例化具体原型类的对象,并调⽤其克隆⽅法来创建新的对象。

【编码部分】

1. 题目描述

        公司正在开发一个图形设计软件,其中有一个常用的图形元素是矩形。设计师在工作时可能需要频繁地创建相似的矩形,而这些矩形的基本属性(如颜色、宽度、高度)相同,但具体的位置可能不同。为了提高设计师的工作效率,请你使用原型模式设计一个矩形对象的原型。该原型可以根据用户的需求进行克隆,生成新的矩形对象。

2. 输入描述

        第一行输入一个整数 N(1 ≤ N ≤ 100),表示需要创建的矩形数量。 接下来的 N 行,每行输入一个字符串,表示矩形的属性信息,分别为颜色,长度,宽度,比如 "Red 10 5"。

3. 输出描述

        对于每个矩形,输出一行字符串表示矩形的详细信息,如 "Color: Red, Width: 10,Height: 5"。

4. C++代码实例

/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file OriginalMode.hpp
* @brief 原型模式
* @autor 写代码的小恐龙er
* @date 2024/01/09
*/

#include<iostream>
#include<string>
using namespace std;

// 前置声明
class Prototype;
class RectanglePrototype;
// 抽象原型类
class Prototype {
public:
    // 公共接口
    virtual Prototype* clone() = 0;
    virtual void PrintInfo() = 0;
};

// 具体的矩阵类
class RectanglePrototype : public Prototype
{
// 成员属性
private:
    string _color;
    int _width;
    int _height;
    
// 成员函数
public:
    RectanglePrototype(string color, int width, int height){
        this->_color = color;
        this->_width = width;
        this->_height = height;
    }
    
    // 重载克隆函数接口 
    Prototype *clone() override {
        return new RectanglePrototype(this->_color, this->_width, this->_height);
    }
    // 重载信息打印函数
    void PrintInfo() override{
        std::cout<< "Color: " << _color << ", Width: " << _width  << ", Height: " << _height << endl;
    }
};

int main()
{
    // 属性 
    string color = "";
    int width = 0;
    int height = 0;
    // 矩阵数量
    int rectangleNum = 0;
    std::cin >> rectangleNum;
    
    for(int i = 0; i < rectangleNum; i++){
        
        std::cin >> color >> width >> height;
        
        // 创建原型对象 
        Prototype *prototypeRectangle = new RectanglePrototype(color, width, height);
        
        // 克隆对象
        Prototype *clonedRectangle = prototypeRectangle->clone();
        
        // 输出信息
        clonedRectangle->PrintInfo();
        
        // 析构掉new 出来的内存
        delete clonedRectangle;
        clonedRectangle = nullptr;
        delete prototypeRectangle;
        prototypeRectangle = nullptr;
    }
    return 0;
}

......

To be continued.

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需通过显式的实例化过程。原型模式通过克隆(clone)已有对象来创建新对象,从而避免了使用传统的构造函数创建对象的开销。 在C++中,原型模式可以通过实现一个可克隆接口(通常称为原型接口)来实现。这个接口通常包含一个克隆方法,用于复制当前对象并返回一个新的副本。派生类可以实现这个接口来定义自己的克隆逻辑。 以下是原型模式的一般实现步骤: 1. 创建一个原型接口(或基类): ``` class Prototype { public: virtual Prototype* clone() const = 0; virtual void setAttributes(...) = 0; virtual void print() const = 0; }; ``` 2. 实现原型接口的具体类(或派生类): ``` class ConcretePrototype : public Prototype { private: // 在派生类中定义特定的属性 // ... public: Prototype* clone() const override { return new ConcretePrototype(*this); } void setAttributes(...) override { // 设置属性值 } void print() const override { // 打印属性值 } }; ``` 3. 在客户端代码中使用原型模式: ``` Prototype* original = new ConcretePrototype(); original->setAttributes(...); Prototype* clone = original->clone(); clone->print(); delete original; delete clone; ``` 通过使用原型模式,我们可以避免在每次创建对象时重复执行初始化的过程,提高了对象的创建效率。此外,原型模式还允许我们在运行时动态地添加或删除对象的属性,并通过克隆来创建新对象。 需要注意的是,在实现原型类时,需要确保所有成员变量都能正确地被拷贝(或克隆)。有时候可能需要自定义拷贝构造函数和赋值运算符来实现深拷贝,以避免浅拷贝带来的问题。 总结起来,原型模式通过克隆已有对象来创建新对象,提供了一种简单且灵活的对象创建方式。它适用于那些对象的创建过程比较复杂或开销较大的情况下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

写代码的小恐龙er

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

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

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

打赏作者

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

抵扣说明:

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

余额充值