实验6:原型模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

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、比较

深克隆:安全,修改克隆对象不会影响原对象,代价是内存使用增加。

浅克隆:效率高,节省内存,但可能导致意外的修改,因为多个对象共享相同的内存。

 

posted @ 2024-10-30 08:25  不会JAVA的小袁  阅读(2)  评论(0编辑  收藏  举报