设计模式实验六
软件设计 石家庄铁道大学信息学院
实验6:原型模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解原型模式的动机,掌握该模式的结构;
2、能够利用原型模式解决实际问题。
[实验任务一]:向量的原型
用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。
实验要求:
1. 画出对应的类图;
![]()
2.提交源代码(用C++完成);
#include <iostream>
#include <stdexcept>
class Vector {
private:
int size; // 向量的长度
double*
data; // 动态数组,用于存储向量的值
public:
// 默认构造函数
Vector() :
size(0), data(nullptr) {}
// 带参数的构造函数
Vector(int size)
: size(size) {
if (size <
0) throw std::invalid_argument("Size must be non-negative.");
data = new
double[size];
for (int i =
0; i < size; ++i) {
data[i] =
0.0; // 初始化为0
}
}
// 浅克隆构造函数
Vector(const
Vector &v) : size(v.size), data(v.data) {
// 这里只复制了指针,未分配新的内存
}
// 深克隆
Vector
deepClone() const {
Vector
clone(size);
for (int i =
0; i < size; ++i) {
clone.data[i] = data[i];
}
return clone;
}
// 析构函数
~Vector() {
delete[]
data;
}
// 设置向量的值
void set(int
index, double value) {
if (index
< 0 || index >= size) {
throw
std::out_of_range("Index out of range.");
}
data[index] =
value;
}
// 获取向量的值
double get(int
index) const {
if (index
< 0 || index >= size) {
throw
std::out_of_range("Index out of range.");
}
return
data[index];
}
// 获取向量的大小
int getSize()
const {
return size;
}
// 打印向量
void print()
const {
for (int i =
0; i < size; ++i) {
std::cout
<< data[i] << " ";
}
std::cout
<< std::endl;
}
};
int main() {
// 测试向量类
Vector v1(5);
for (int i = 0; i
< 5; ++i) {
v1.set(i, i *
1.0);
}
std::cout
<< "Vector v1: ";
v1.print();
// 浅克隆
Vector v2 = v1;
// 浅克隆
std::cout
<< "Vector v2 (shallow copy): ";
v2.print();
// 修改v1,查看v2的变化
v1.set(0, 100);
std::cout
<< "After modifying v1, v2: ";
v2.print(); // v2会受到影响
// 深克隆
Vector v3 =
v1.deepClone();
std::cout
<< "Vector v3 (deep copy): ";
v3.print();
// 修改v1,查看v3的变化
v1.set(1, 200);
std::cout
<< "After modifying v1, v3: ";
v3.print(); // v3不会受到影响
return 0;
}
3.注意编程规范。
浅克隆:
仅复制指针,新的对象与原对象共享同一块内存。
修改原对象的内容会影响到浅克隆的对象。
深克隆:
复制所有数据到新的内存区域,两个对象互不影响。
修改原对象的内容不会影响深克隆的对象。