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

发布时间:2024年01月16日

【提示:如果不想看文字介绍,可以直接跳转到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.

文章来源:https://blog.csdn.net/K1_uestc/article/details/135489333
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。