每日博客
原型模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
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();
}
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号