【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】
【简介】什么是原型模式
????????原型模式?种创建型设计模式,该模式的核?思想是基于现有的对象创建新的对象,?不是从头开始创建。在原型模式中,通常有?个原型对象,它被?作创建新对象的模板。新对象通过复制原型对象的属性和状态来创建,??需知道具体的创建细节。
【应用场景】
????????如果?个对象的创建过程?较复杂时(?如需要经过?系列的计算和资源消耗),那每次创建该对象都需要消耗资源,?通过原型模式就可以复制现有的?个对象来迅速创建/克隆?个新对象,不必关?具体的创建细节,可以降低对象创建的成本。
????????相?于直接实例化对象,通过原型模式复制对象可以减少资源消耗,提?性能,尤其在对象的创建过程复杂或对象的创建代价较?的情况下。当需要频繁创建相似对象、并且可以通过克隆避免重复初始化?作的场景时可以考虑使?原型模式,在克隆对象的时候还可以动态地添加或删除原型对象的属性,创造出相似但不完全相同的对象,提?了灵活性。
????????但是使?原型模式也需要考虑到如果对象的内部状态包含了引?类型的成员变量,那么实现深拷?就会变得较为复杂,需要考虑引?类型对象的克隆问题。
【基本结构】
????????实现原型模式需要给【原型对象】声明?个克隆?法,执?该?法会创建?个当前类的新对象,并将原始对象中的成员变量复制到新?成的对象中,?不必实例化。并且在这个过程中只需要调?原型对象的克隆?法,??需知道原型对象的具体类型。
????????原型模式包含两个重点模块:
????????在客户端代码中,可以声明?个具体原型类的对象,然后调?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.