五、原型模型

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

优点: 1、性能提高。 2、逃避构造函数的约束。

缺点: 1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。 2、必须实现 Cloneable 接口。

使用场景: 1、资源优化场景。 2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。 3、性能和安全要求的场景。 4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。 5、一个对象多个修改者的场景。 6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。 7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用。

java

public class Prototype implements Cloneable { 
  
 public Object clone() throws CloneNotSupportedException { 
  Prototype proto = (Prototype) super.clone(); 
  return proto; 
 } 
} 

c++

#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
	virtual Person* clone()=0;
	virtual void printT()=0;
	virtual void setResume(char *p)=0;
protected:

private:
};
class CPlusPlusProgrammer:public Person
{
public:
	CPlusPlusProgrammer()
	{
		m_name="";
		m_age=0;
		m_resume=NULL;
		setResume("aaaa");
	}
	CPlusPlusProgrammer(string name,int age)
	{
		m_name=name;
		m_age=age;
		m_resume=NULL;
		setResume("aaaa");
	}
	void setResume(char *p)
	{
		if(m_resume!=NULL)
		{
			delete m_resume;
		}
		m_resume=new char[strlen(p)+1];
		strcpy(m_resume,p);
	}
	virtual void printT()
	{
		cout<<"m_name:"<<m_name<<"	m_age:"<<m_age<<"	m_resume:"<<m_resume<<endl;
	}
	virtual Person*clone()
	{
		CPlusPlusProgrammer *tmp=new CPlusPlusProgrammer;
		*tmp=*this;
		tmp->m_resume=new char[strlen(m_resume)+1];
		strcpy(tmp->m_resume,m_resume);
		return tmp;
	}
protected:
private:
	string m_name;
	int m_age;
	char *m_resume;
};

int main()
{
	Person *c1=new CPlusPlusProgrammer("张三",32);
	c1->setResume("你好");
	Person *c2=c1->clone();
	c1->printT();
	c2->printT();
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/shuangyueliao/article/details/81396716
今日推荐