每日博客

原型模式

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

1、理解原型模式的动机,掌握该模式的结构;

2、能够利用原型模式解决实际问题。

 

 

[实验任务一]:向量的原型

用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。

C++版

#include <iostream>
#include <string>
#include <memory>

using namespace std;

template<class T>
class ICloneable
{
public:
virtual T* clone() = 0;
};
//深拷贝
class CResume : public ICloneable<CResume>
{
public:
CResume(){}
~CResume()
{
cout << "CResume析构 "<<endl;
}

void setInfo(const double& a, const double& b)
{
m_a = a;
m_b = b;
}

CResume* clone()
{
CResume* resume = new CResume;
resume->setInfo(m_a, m_b);
return resume;
}

void printInfo()
{
cout << "(" << m_a<<","<<m_b<<")" << endl;
}
protected:
double m_a;
double m_b;
};
void testPrototype()
{
CResume re;
re.setInfo(1,2);
re.printInfo();

CResume* pClone = re.clone();
pClone->setInfo(1,3);
pClone->printInfo();

delete pClone;
pClone = NULL;
}
//浅拷贝
class CWorkExperience
{
public:
CWorkExperience(){}
CWorkExperience(const double& a,const double& b)
{
m_a = a;
m_b = b;
}

CWorkExperience(const CWorkExperience& right)
{
m_a = right.m_a;
m_b = right.m_b;
}

~CWorkExperience()
{
cout << "CWorkExperience析构" << endl;
printInfo();
}

void setCompany(const double& a)
{
m_a = a;
}

const double& getCompany() const
{
return m_a;
}

void setWorkTime(const double& b)
{
m_b = b;
}

const double& getWorkTime() const
{
return m_b;
}

void printInfo()
{
cout << "(" << m_a<<","<<m_b<<")" << endl;
}

private:
double m_a; // company name
double m_b; // work time
};
class Resume : public ICloneable<Resume>
{
private:
Resume(){m_experience = NULL;}
public:
// 带参构造函数
Resume(CWorkExperience* pWorkExperience)
{
m_experience = pWorkExperience;
}

// 带参拷贝构造函数
Resume(const Resume& right)
{
// 注意这里是指针赋值 属于浅拷贝
m_experience = right.m_experience;
}

~Resume()
{
cout << "Resume析构 " << endl;
}

void setExperience(const double& a,const double& b)
{
m_experience->setCompany(a);
m_experience->setWorkTime(b);
}

Resume* clone()
{
// 调用拷贝构造函数 浅拷贝
Resume* resume = new Resume(*this);
return resume;
}

void printInfo()
{
m_experience->printInfo();
cout << endl;
}
protected:
CWorkExperience* m_experience;// 指针 聚合
};

void Prototype()
{
CWorkExperience* pWorkExperience = new CWorkExperience(1,2);
Resume re(pWorkExperience); // 只能这样构造 无参构造被屏蔽掉了
re.printInfo();

Resume* pClone = re.clone(); // 指针赋值 浅拷贝
//delete pWorkExperience; // 这里如果调用delete 程序会崩溃(因为是共享)
pClone->setExperience(1,3);
pClone->printInfo();

re.printInfo(); // 我们发现原对象的workExperience属性已经被修改

delete pClone;
delete pWorkExperience;
pClone = NULL;
pWorkExperience = NULL;
}
main()
{
testPrototype();
Prototype();
}

posted @ 2021-11-10 21:01  谦寻  阅读(52)  评论(0编辑  收藏  举报