设计模式六
软件设计 石家庄铁道大学信息学院
实验6:原型模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解原型模式的动机,掌握该模式的结构;
2、能够利用原型模式解决实际问题。
[实验任务一]:向量的原型
用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。
实验要求:
1. 画出对应的类图;
2. 提交源代码(用C++完成);
#include <iostream>
class Vector { private: int* data; // 指向向量数据的指针 int size; // 向量的长度
public: // 构造函数 Vector(int size) { this->size = size; data = new int[size]; }
// 析构函数 ~Vector() { delete[] data; }
// 获取向量长度 int getSize() { return size; }
// 获取指定位置的元素 int getElement(int index) { return data[index]; }
// 设置指定位置的元素 void setElement(int index, int value) { data[index] = value; }
// 浅克隆 Vector shallowClone() { Vector clone(size); clone.data = data; return clone; }
// 深克隆 Vector deepClone() { Vector clone(size); for (int i = 0; i < size; i++) { clone.data[i] = data[i]; } return clone; } };
int main() { // 创建一个长度为5的向量 Vector v(5);
// 设置向量元素的值 for (int i = 0; i < v.getSize(); i++) { v.setElement(i, i + 1); }
// 浅克隆 Vector shallowCopy = v.shallowClone();
// 修改原始向量的第一个元素 v.setElement(0, 10);
// 输出浅克隆后的向量 std::cout << "浅克隆: "; for (int i = 0; i < shallowCopy.getSize(); i++) { std::cout << shallowCopy.getElement(i) << " "; } std::cout << std::endl;
// 深克隆 Vector deepCopy = v.deepClone();
// 修改原始向量的第一个元素 v.setElement(0, 20);
// 输出深克隆后的向量 std::cout << "深克隆: "; for (int i = 0; i < deepCopy.getSize(); i++) { std::cout << deepCopy.getElement(i) << " "; } std::cout << std::endl;
return 0; } |
深浅克隆的异同 异同点: 1. 相同点:浅克隆和深克隆都是用来复制对象的方式,可以创建一个新的对象并将原始对象的值复制给新对象。 2. 相同点:它们都可以用于向量类的复制,以实现对向量的克隆。 异点: 1. 复制方式:浅克隆只复制对象的引用或指针,而不会复制对象本身的内容。这意味着原始对象和克隆对象将引用相同的内存地址。深克隆则会创建一个全新的对象,并将原始对象的内容逐个复制到新对象中,使得原始对象和克隆对象完全独立。 2. 数据独立性:由于浅克隆只是复制引用,所以原始对象和克隆对象共享相同的数据。这意味着对原始对象的修改也会影响到克隆对象。而深克隆创建了一个独立的对象,使得对原始对象的修改不会影响到克隆对象。 3. 内存管理:浅克隆不需要额外的内存管理,因为它只是复制了指针。而深克隆需要额外的内存来存储复制后的对象内容,并且需要手动管理内存的释放。 |