设计模式学习笔记(11)——原型模式实现

一、简历代码初步实现

package operation;

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 Display() {
		  System.out.println(name+" "+sex+" "+age);
	        System.out.println("工作经历:"+timeArea+" "+company);
	}
}
public class Main{
    public static void main(String[] args) {
        Resume a=new Resume("大鸟");
        a.SetPersonalInfo("男", "29");
        a.SetWorkExperience("1998-2000", "XX公司");
        Resume b=new Resume("大鸟");
        b.SetPersonalInfo("男", "29");
        b.SetWorkExperience("1998-2000", "XX公司");
        Resume c=new Resume("大鸟");
        c.SetPersonalInfo("男", "29");
        c.SetWorkExperience("1998-2000", "XX公司");
        a.Display();
        b.Display();
        c.Display();
    }
}

这样写的话三份简历需要三次实例化。
可以这样写:

public class Main{
    public static void main(String[] args) {
        Resume a=new Resume("大鸟");
        a.SetPersonalInfo("男", "29");
        a.SetWorkExperience("1998-2000", "XX公司");
        Resume b=a;
        Resume c=a;
        a.Display();
        b.Display();
        c.Display();
    }
}

这其实是传引用,不是传值,这样就如同在b纸张和c纸张上写着简历在a处一样。
二、原型模式
在这里插入图片描述

package operation;

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 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 Display()
    {
        System.out.println(name+" "+sex+" "+age);
        System.out.println(timeArea+" "+company);
    }

    public Object Clone() throws CloneNotSupportedException
    {
        return (Object)super.clone();
    }

}

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {

        Resume a = new Resume("大鸟");
        a.SetPersonalInfo("男", "29");
        a.SetWorkExperience("1998-2000", "XX公司");

        Resume b = (Resume)a.Clone();
        b.SetWorkExperience("1998-2006", "YY企业");

        Resume c = (Resume)a.Clone();
        c.SetPersonalInfo("男", "24");

        a.Display();
        b.Display();
        c.Display();

    }

}

三、浅复制与深复制

package operation;

 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 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 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 Display()
    {
        System.out.println(name+" "+sex+" "+age);
        System.out.println(work.getWorkDate()+" "+work.getCompany());
    }

    public Object Clone() throws CloneNotSupportedException
    {
        return (Object)super.clone();
    }

}



  public class Main {

	    public static void main(String[] args) throws CloneNotSupportedException {

	        Resume a = new Resume("大鸟");
	        a.SetPersonalInfo("男", "29");
	        a.SetWorkExperience("1998-2000", "XX公司");

	        Resume b = (Resume)a.Clone();
	        b.SetWorkExperience("1998-2006", "YY企业");

	        Resume c = (Resume)a.Clone();
	        c.SetPersonalInfo("男", "24");
	        c.SetWorkExperience("1998-2003", "ZZ企业");

	        a.Display();
	        b.Display();
	        c.Display();

	    }

	}

浅复制就是被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
但我们可能有这样一种需求,把要复制的对象所引用的对象都复制一遍。深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
在这里插入图片描述

package operation;

class WorkExperience implements Cloneable {

    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() throws CloneNotSupportedException
    {
        return (Object)super.clone();
    }

}


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) throws CloneNotSupportedException
	    {
	        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 Display()
	    {
	        System.out.println(name+" "+sex+" "+age);
	        System.out.println(work.getWorkDate()+" "+work.getCompany());
	    }

	    public Object Clone() throws CloneNotSupportedException
	    {
	        Resume obj = new Resume(this.work);

	        obj.name = this.name;
	        obj.sex = this.sex;
	        obj.age = this.age;

	        return obj;
	    }

	}
	

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {

        Resume a = new Resume("大鸟");
        a.SetPersonalInfo("男", "29");
        a.SetWorkExperience("1998-2000", "XX公司");

        Resume b = (Resume)a.Clone();
        b.SetWorkExperience("1998-2006", "YY企业");

        Resume c = (Resume)a.Clone();
        c.SetPersonalInfo("男", "24");
        c.SetWorkExperience("1998-2003", "ZZ企业");

        a.Display();
        b.Display();
        c.Display();

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值