【设计模式】原型

一、简易代码初步实现
一个简历类,需要有名字,可以设置性别年龄、工作经历,以此类写出三份简历,如下:

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();

但是由于这种方式非常复杂,具体应用中需要实例化的对象会太多,因此主类也可以这样写

    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();
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值