一、简易代码初步实现
假如现在写一个简历类,要有名字,可以设置性别年龄,可以设置工作经历,以此类写出三份简历,如下:
class Resume{
private String name;
private String sex;
private String age;
private String timeArea;
private String company;
public Resume(String name) {
this.name=name;
}
//设置个人信息
public void SetPersonalInfo(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 Dispiay() {
System.out.println(name+" "+age+" "+sex+" ");
System.out.println(timeArea+" "+company);
}
}
public class yc {
public static void main(String[] args) {
// TODO Auto-generated method stub
Resume a=new Resume("大鸟");
a.SetPersonalInfo("男","29");
a.SetWorkExperience("1998-2000","xxx公司");
Resume b=new Resume("大鸟");
b.SetPersonalInfo("男","29");
b.SetWorkExperience("1998-2000","xxx公司");
Resume c=new Resume("大鸟");
c.SetPersonalInfo("男","29");
c.SetWorkExperience("1998-2000","xxx公司");
a.Dispiay();
b.Dispiay();
c.Dispiay();
//以上代码非常麻烦,如果写20份简历,就要实例20份对象
因此主类也可以这样写
Resume a=new Resume("大鸟");
a.SetPersonalInfo("男","29");
a.SetWorkExperience("1998-2000","xxx公司");
Resume b=a;
Resume c=a;
a.Dispiay();
b.Dispiay();
c.Dispiay();
//但是传引用,而不是传值,没有实际内容
二、原型模式
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新对象。
原型类
abstract class Prototype{
private String id;
public Prototype(String id) {
this.id=id;
}
public String getID() {
return id;
}
public abstract Prototype Clone();
}
具体原型类
class ConcertePrototype1 extends Prototype{
public ConcertePrototype1(String id) {
super(id);
// TODO Auto-generated constructor stub
}
@Override
public Prototype Clone() {
// TODO Auto-generated method stub
return (Prototype)this.Clone();
}
}
客户端代码
ConcertePrototype1 p1=new ConcertePrototype1("I");
ConcertePrototype1 c1=(ConcertePrototype1)p1.Clone();
System.out.println(c1.getID());
三、简历类原型模式实现
还是以简历类为例,来实现它的原型模式
class Resume{
private String name;
private String sex;
private String age;
private String timeArea;
private String company;
public Resume(String name) {
this.name=name;
}
//设置个人信息
public void SetPersonalInfo(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 Dispiay() {
System.out.println(name+" "+age+" "+sex+" ");
System.out.println(timeArea+" "+company);
}
public Object Clone() {
// TODO Auto-generated method stub
return (Object)this.Clone();
}
}
public class yc {
public static void main(String[] args) {
// TODO Auto-generated method stub
Resume a=new Resume("大鸟");
a.SetPersonalInfo("男","29");
a.SetWorkExperience("1998-2000","xxx公司");
Resume b=(Resume)a.Clone();
//只需调用clone方法就可以生成新的简历,并可以进行新简历的细节修改
b.SetWorkExperience("1998-2006", "YY企业");
Resume c=(Resume)a.Clone();
c.SetPersonalInfo("男", "24");
a.Dispiay();
b.Dispiay();
c.Dispiay();
}
}
四、简历类的浅复制
//当复制中出现引用的时候引用同一个对象
class WorkExperience{
private String workDate;
private String company;
public String getWorkDate() {
return workDate;
}
public void setWorkDate(String workDate) {
this.workDate = workDate;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
}
class Resume{
private String name;
private String sex;
private String age;
//引用“工作经历对象”
private WorkExperience work;
public Resume(String name) {
this.name=name;
work=new WorkExperience();//在“简历”类实例化时同时实例化“工作经历”
}
//设置个人信息
public void SetPersonalInfo(String sex,String age) {
this.sex=sex;
this.age=age;
}
//设置工作经历
public void SetWorkExperience(String workDate,String company) {
work.setWorkDate(workDate);
work.setCompany(company);
}
public void Dispiay() {
System.out.println(name+" "+age+" "+sex+" ");
System.out.println(work.getWorkDate()+" "+work.getCompany());
}
public Object Clone() {
// TODO Auto-generated method stub
return (Object)this.Clone();
}
}
public class yc {
public static void main(String[] args) {
// TODO Auto-generated method stub
Resume a=new Resume("大鸟");
a.SetPersonalInfo("男","29");
a.SetWorkExperience("1998-2000","xxx公司");
Resume b=(Resume)a.Clone();
b.SetWorkExperience("1998-2006", "YY企业");
Resume c=(Resume)a.Clone();
c.SetWorkExperience("1998-2003", "zz企业");
//b和c都克隆a,但是当他们都设置了“工作经历”时,我们希望的结果是三个的显示不一样
//但是三个的显示都是最有一次设置的值
a.Dispiay();
b.Dispiay();
c.Dispiay();
}
}
原型模式的复制只针对字段,对方法对象并不进行复制
五、简历类的深复制
//深复制克隆
class WorkExperience{
private String workDate;
private String company;
public String getWorkDate() {
return workDate;
}
public void setWorkDate(String workDate) {
this.workDate = workDate;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
//“工作经历”类的实现克隆方法
public Object Clone() {
return (Object)this.Clone();
}
}
class Resume{
private String name;
private String sex;
private String age;
//引用“工作经历对象”
private WorkExperience work;
public Resume(String name) {
this.name=name;
work=new WorkExperience();//在“简历”类实例化时同时实例化“工作经历”
}
//提供Clone方法调用的私有构造方法,以便克隆“工作经历”的数据
private Resume(WorkExperience work) {
this.work=(WorkExperience)work.Clone();
}
//设置个人信息
public void SetPersonalInfo(String sex,String age) {
this.sex=sex;
this.age=age;
}
//设置工作经历
public void SetWorkExperience(String workDate,String company) {
work.setWorkDate(workDate);
work.setCompany(company);
}
public void Dispiay() {
System.out.println(name+" "+age+" "+sex+" ");
System.out.println(work.getWorkDate()+" "+work.getCompany());
}
public Object Clone() {
// TODO Auto-generated method stub
Resume obj=new Resume(this.work);
obj.name=this.name;
obj.age=this.age;
obj.sex=this.sex;
return obj;
}
}
public class yc {
public static void main(String[] args) {
// TODO Auto-generated method stub
Resume a=new Resume("大鸟");
a.SetPersonalInfo("男","29");
a.SetWorkExperience("1998-2000","xxx公司");
Resume b=(Resume)a.Clone();
b.SetWorkExperience("1998-2006", "YY企业");
Resume c=(Resume)a.Clone();
c.SetWorkExperience("1998-2003", "zz企业");
//b和c都克隆a,但是当他们都设置了“工作经历”时,我们希望的结果是三个的显示不一样
//这样三个的显示都是最有一次设置的值
a.Dispiay();
b.Dispiay();
c.Dispiay();
}
}