實驗6:原型模式

不会JAVA的小袁發表於2024-10-30

本次實驗屬於模仿型實驗,透過本次實驗學生將掌握以下內容:

1、理解原型模式的動機,掌握該模式的結構;

2、能夠利用原型模式解決實際問題

[實驗任務一]:向量的原型

C++完成數學中向量的封裝,其中,用指標和動態申請支援向量長度的改變,使用淺克隆和深克隆複製向量類,比較這兩種克隆方式的異同。

實驗要求:

1.畫出對應的類圖;

2.提交原始碼(用C++完成);

3.注意程式設計規範。

1、類圖

2、

2、原始碼

#include <iostream>

#include <cstring>

class Vector {

private:

int* data;

size_t length;

public:

// 建構函式

Vector(size_t len) : length(len) {

data = new int[length];

for (size_t i = 0; i < length; ++i) {

data[i] = 0; // 初始化為0

}

}

// 解構函式

~Vector() {

delete[] data;

}

// 深克隆

Vector* deepClone() const {

Vector* newVector = new Vector(length);

for (size_t i = 0; i < length; ++i) {

newVector->data[i] = data[i]; // 複製資料

}

return newVector;

}

// 淺克隆

Vector* shallowClone() const {

return new Vector(*this); // 直接複製物件

}

// 設定向量值

void setValue(size_t index, int value) {

if (index < length) {

data[index] = value;

}

}

// 獲取向量值

int getValue(size_t index) const {

return (index < length) ? data[index] : 0;

}

// 列印向量

void print() const {

for (size_t i = 0; i < length; ++i) {

std::cout << data[i] << " ";

}

std::cout << std::endl;

}

};

int main() {

Vector vec1(5);

vec1.setValue(0, 1);

vec1.setValue(1, 2);

vec1.setValue(2, 3);

vec1.setValue(3, 4);

vec1.setValue(4, 5);

std::cout << "原始向量: ";

vec1.print();

// 深克隆

Vector* deepCloneVec = vec1.deepClone();

deepCloneVec->setValue(0, 10); // 修改深克隆物件

std::cout << "深克隆向量: ";

deepCloneVec->print();

// 淺克隆

Vector* shallowCloneVec = vec1.shallowClone();

shallowCloneVec->setValue(0, 20); // 修改淺克隆物件

std::cout << "淺克隆向量: ";

shallowCloneVec->print();

// 清理動態分配的記憶體

delete deepCloneVec;

delete shallowCloneVec;

return 0;

}

3、執行截圖

4、比較

深克隆:安全,修改克隆物件不會影響原物件,代價是記憶體使用增加。

淺克隆:效率高,節省記憶體,但可能導致意外的修改,因為多個物件共享相同的記憶體。

相關文章