原型模式:用原型实例指定创建指定对象的种类,并且通过复制这些原型创建新的对象,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。
注意:如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但是不复制引用的对象,因此,原始对象及其复本引用同一对象。
潜复制:被复制对象的所有变量都含有原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。
深复制:把引用对象的变量指向复制过来的新对象,而不是原有的被引用的对象;
潜复制实例UML图
深复制实例UML图:
潜复制代码:
/**
* @author Shuyu.Wang
* @package:com.shuyu.prototype
* @description:
* @date 2018-11-16 23:11
**/
@Data
public class WorkExperience {
private String workDate;
private String company;
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.prototype
* @description:原型类,实现Cloneable,重写clone(),实现浅复制
* @date 2018-11-16 23:05
**/
@Slf4j
public class Resume implements Cloneable{
private String name;
private String sex;
private String age;
private WorkExperience workExperience;
public Resume(String name){
this.name=name;
workExperience=new WorkExperience();
}
public void setPersonInfo(String sex,String age){
this.sex=sex;
this.age=age;
}
public void setWorkExperience(String workDate,String company){
workExperience.setWorkDate(workDate);
workExperience.setCompany(company);
}
public void show(){
log.info("name="+name,",sex="+sex,",age="+age);
log.info("company="+workExperience.getCompany(),"workDate="+workExperience.getWorkDate());
}
@Override
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
深复制代码:
/**
* @author Shuyu.Wang
* @package:com.shuyu.prototype
* @description:
* @date 2018-11-16 23:11
**/
@Data
public class WorkExperience2 implements Cloneable{
private String workDate;
private String company;
@Override
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.prototype
* @description:原型类,实现Cloneable,重写clone(),实现深复制
* @date 2018-11-16 23:05
**/
@Slf4j
public class Resume2 implements Cloneable{
private String name;
private String sex;
private String age;
private WorkExperience2 workExperience;
public Resume2(String name){
this.name=name;
workExperience=new WorkExperience2();
}
public void setPersonInfo(String sex,String age){
this.sex=sex;
this.age=age;
}
public void setWorkExperience(String workDate,String company){
workExperience.setWorkDate(workDate);
workExperience.setCompany(company);
}
public void show(){
log.info("name="+name,",sex="+sex,",age="+age);
log.info("company="+workExperience.getCompany(),"workDate="+workExperience.getWorkDate());
}
@Override
public Object clone() {
Resume2 clone = null;
try {
clone = (Resume2)super.clone();
clone.workExperience=(WorkExperience2) workExperience.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
测试代码:
@RunWith(SpringRunner.class)
@SpringBootTest
public class PrototypeApplicationTests {
@Test
public void clone1() {
Resume resume=new Resume("测试1");
resume.setPersonInfo("男","25");
resume.setWorkExperience("2016-2017","台达");
Resume resume1=(Resume)resume.clone();
resume1.setWorkExperience("2017-2018","百度");
Resume resume2=(Resume)resume.clone();
resume2.setWorkExperience("2018-2019","阿里");
resume.show();
resume1.show();
resume2.show();
}
@Test
public void clone2() {
Resume2 resume=new Resume2("测试1");
resume.setPersonInfo("男","25");
resume.setWorkExperience("2016-2017","台达");
Resume2 resume1=(Resume2)resume.clone();
resume1.setWorkExperience("2017-2018","百度");
Resume2 resume2=(Resume2)resume.clone();
resume2.setWorkExperience("2018-2019","阿里");
resume.show();
resume1.show();
resume2.show();
}
}
运行结果如下:
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : name=测试1
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : company=阿里
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : name=测试1
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : company=阿里
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : name=测试1
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : company=阿里
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : name=测试1
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : company=阿里
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : name=测试1
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : company=阿里
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : name=测试1
2018-11-16 23:40:51.859 INFO 44132 --- [ main] com.shuyu.prototype.Resume : company=阿里
代码github地址:https://github.com/iot-wangshuyu/designpatterns/tree/master/prototype