设计模式之原型模式与实例

版权声明:本文为博主原创文章,如若转载请注明本人原始地址。 https://blog.csdn.net/Andy_93/article/details/78008299

意图

用原型实例指定穿件对象的种类,并通过拷贝这些原型创建新对象

参与者

1 抽象原型(Prototype) : 声明一个克隆自身的接口
2 具体原型(ConcretePrototype):实现一个克隆自身的操作
3 客户(Client): 让一个原型克隆自身从而穿件一个新的对象

适用性

当一个系统应该独立于它的产品创建、构成和表示时,要使用原型模式
当要实例化的类实在运动时刻指定时,比如动态装载
为了避免创建一个与产品层次平行的工厂类层次时
当一个类的实例只能有几个不同状态组合中的一种时

实例

class CComputer
{
public:
	virtual CComputer* clone() = 0;
	virtual void displayInfo() = 0;
};

class CASUSComputer : public  CComputer
{
public:
	CASUSComputer() 
	{
		m_strCPU = "ASUS CPU";
		m_strHost = "ASUS Host";
		m_Monitor = "ASUS Monitor";
	}

	CASUSComputer(const CASUSComputer &item)
	{
		this->m_strCPU = item.m_strCPU;
		this->m_strHost = item.m_strHost;
		this->m_Monitor = item.m_Monitor;
	}

	CComputer* clone()
	{
		return new CASUSComputer(*this);
	}

	void displayInfo()
	{
		cout << m_strCPU.c_str() << endl;
		cout << m_strHost.c_str() << endl;
		cout << m_Monitor.c_str() << endl;
	}
private:
	string m_strCPU;
	string m_strHost;
	string m_Monitor;
};

int main(int argc, char* argv[])
{
	cout << "strat!!"<<endl;
	system("pause");
	CComputer* pCom = new CASUSComputer();
	cout << "cerate a CASUSComputer onject!!" << endl;
	system("pause");

	CComputer* pComCopy = pCom->clone();
	pComCopy->displayInfo();
	system("pause");
	return 0;
}

总结

其实原型模式比较简单,也容易理解,每次调用clone函数就能获得一个拷贝对象,这个拷贝时深拷贝。这对于动态加载的对象时很有用的,如果原对象状态每次都在变动,那么每次调用clone函数获取的对象就是最新的状态的对象。

猜你喜欢

转载自blog.csdn.net/Andy_93/article/details/78008299