原型模式,用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。通俗的說法就是從一個對象再創建另外一個可定製的對象,而且不需要知道任何創建的細節。
先看一個“錢復制”的例子
1、簡歷類
public class Resume implements Cloneable{
private String name;
private String sex;
private String age;
private String timeArea;
private String company;
public Resume(String name){
this.name = name;
}
public void setPersonInfo(String sex,String age){
this.sex = sex;
this.age = age;
}
public void setWorkExperience(String timeArea,String company){
this.timeArea = timeArea;
this.company = company;
}
public void display(){
System.out.println(name+":"+sex+":"+age);
System.out.println("工作經歷"+timeArea+":"+company);
}
@Override
protected Object clone(){
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
}
2、測試public class Test {
public static void main(String[] args) {
Resume a = new Resume("大鳥");
a.setPersonInfo("man", "22");
a.setWorkExperience("2011-12-22", "XX公司");
Resume b = (Resume)a.clone();
b.setWorkExperience("2012-11-22", "YY公司");
Resume c = (Resume)a.clone();
c.setPersonInfo("man", "24");
a.display();
b.display();
c.display();
}
}
上面的例子是“淺複製”,讓我們把工作經驗用一個單獨的類來表示,看看結果如何,更改簡歷類
3、更改後的簡歷類
public class Resume implements Cloneable{
private String name;
private String sex;
private String age;
private WorkExperience work;
public Resume(String name){
this.name = name;
work = new WorkExperience();
}
public void setPersonInfo(String sex,String age){
this.sex = sex;
this.age = age;
}
public void setWorkExperience(String workData,String company){
work.setWorkData(workData);
work.setCompany(company);
}
public void display(){
System.out.println(name+":"+sex+":"+age);
System.out.println("工作經歷"+work.getWorkData()+":"+work.getCompany());
}
@Override
protected Object clone(){
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
}
淺複製,被複制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象。還有一種複製是深複製,深複製把引用對象的變量指向複製過的新對象,而不是原有的被引用的對象。下面我們來看看如何實現簡歷的深複製。
4、更改後的工作經驗類
public class WorkExperience implements Cloneable{
private String workData;
private String company;
public String getWorkData() {
return workData;
}
public void setWorkData(String workData) {
this.workData = workData;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
protected Object clone(){
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
}
5、更改後的簡歷類public class Resume implements Cloneable{
private String name;
private String sex;
private String age;
private WorkExperience work;
public Resume(String name){
this.name = name;
work = new WorkExperience();
}
private Resume(WorkExperience work){
this.work = (WorkExperience)work.clone();
}
public void setPersonInfo(String sex,String age){
this.sex = sex;
this.age = age;
}
public void setWorkExperience(String workData,String company){
work.setWorkData(workData);
work.setCompany(company);
}
public void display(){
System.out.println(name+":"+sex+":"+age);
System.out.println("工作經歷"+work.getWorkData()+":"+work.getCompany());
}
@Override
protected Object clone(){
Resume obj = new Resume(this.work);
obj.name = this.name;
obj.age = this.age;
obj.sex = this.sex;
return obj;
}
}