一、介紹
Java中自帶的原型模式是clone()方法。該方法是Object的方法,native類型。他的作用就是將對(duì)象的在內(nèi)存的那一塊內(nèi)存數(shù)據(jù)一字不差地再?gòu)?fù)制一個(gè)。我們寫簡(jiǎn)單類的時(shí)候只需要實(shí)現(xiàn)Cloneable接口,然后調(diào)用Object::clone方法就可實(shí)現(xiàn)克隆功能。這樣實(shí)現(xiàn)的方式是淺拷貝。
?1、深復(fù)制與淺復(fù)制:
(1)淺復(fù)制:被復(fù)制對(duì)象的所有變量都含有與原來的對(duì)象相同的值,而所有的對(duì)其他對(duì)象的引用都仍然指向原來的對(duì)象;
//原型類
public class Resume implements Cloneable,Serializable{
private static final long serialVersionUID = 1L;
private String name;
private String sex;
private String age;
Resume(String name,String sex,String age){
this.name=name;
this.sex=sex;
this.age=age;
}
/**
* 設(shè)置個(gè)人信息
* @param sex
* @param age
*/
public void setPersonInfo(String sex,String age){
this.sex=sex;
this.age=age;
}
//描述
public void dispaly(){
System.out.println("姓名:"+name+"\t年齡:"+age+"\t性別:"+sex);
}
public Object clone(){
try {
Resume resume = (Resume)super.clone();
return resume;
}catch (Exception e){
return null;
}
}
}
? 客戶端:
public class MainTest {
public static void main(String[] args){
Resume resume = new Resume("大鳥","男","25");
Resume resume2 = (Resume)resume.clone();
resume2.setPersonInfo("男","26");
resume.dispaly();
resume2.dispaly();
}
}
?(2)深復(fù)制:把引用對(duì)象的變量指向復(fù)制過的新對(duì)象,而不是原有的被引用的對(duì)象。
? ? ? 新增對(duì)象類
public class WorkExperience implements Cloneable{
private String workDate;
private String company;
public WorkExperience(String workDate,String company){
this.workDate=workDate;
this.company=company;
}
public WorkExperience(){}
/**省略set、get方法*/
public Object clone(){
try {
return super.clone();
}catch (Exception e){
return null;
}
}
}
public class Resume implements Cloneable,Serializable{
private static final long serialVersionUID = 1L;
private String name;
private String sex;
private String age;
private WorkExperience workExperience;
Resume(String name,String sex,String age){
this.name=name;
this.sex=sex;
this.age=age;
this.workExperience=new WorkExperience();
}
/**
* 添加私有構(gòu)造 克隆工作經(jīng)歷
* @param workExperience
*/
private Resume(WorkExperience workExperience){
this.workExperience= (WorkExperience) workExperience.clone();
}
/**
* 設(shè)置個(gè)人信息
* @param sex
* @param age
*/
public void setPersonInfo(String sex,String age){
this.sex=sex;
this.age=age;
}
/**
* 設(shè)置工作經(jīng)歷
* @param workDate
* @param company
*/
public void setWorkExperience(String workDate, String company){
this.workExperience.setWorkDate(workDate);
this.workExperience.setCompany(company);
}
//描述
public void dispaly(){
System.out.println("姓名:"+name+"\t年齡:"+age+"\t性別:"+sex);
System.out.println("工作經(jīng)歷:"+workExperience.getWorkDate()+"\t"+workExperience.getCompany());
}
/**
* 重寫了克隆方法
* @return
*/
public Object clone(){
try {
Resume resume = new Resume(this.workExperience);//調(diào)用私有構(gòu)造器實(shí)現(xiàn)工作經(jīng)歷克隆
//給對(duì)象屬性重新賦值--最終返回的是深復(fù)制的resume對(duì)象
resume.name=this.name;
resume.sex=this.sex;
resume.age=this.age;
return resume;
}catch (Exception e){
return null;
}
}
}
?客戶端
public class MainTest {
public static void main(String[] args){
Resume resume = new Resume("大鳥","男","25");
resume.setWorkExperience("2015-2016","南京工作");
Resume resume2 = (Resume)resume.clone();
resume2.setPersonInfo("男","26");
resume2.setWorkExperience("2016-2018","上海工作");
resume.dispaly();
resume2.dispaly();
}
}
二、應(yīng)用:文章來源:http://www.zghlxwxcb.cn/news/detail-651311.html
1、數(shù)據(jù)集對(duì)象DataSet,有Clone()方法和Copy()方法,Clone用于復(fù)制結(jié)構(gòu)而不復(fù)制數(shù)據(jù),實(shí)現(xiàn)了原型模式的淺復(fù)制;Copy不但復(fù)制結(jié)構(gòu)也復(fù)制數(shù)據(jù),實(shí)現(xiàn)了原型模式的深復(fù)制。文章來源地址http://www.zghlxwxcb.cn/news/detail-651311.html
到了這里,關(guān)于設(shè)計(jì)模式(6)原型模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!