设计模式第六次作业——原型模式和建造者模式

/设计模式之建造者模式与原型模式/

// 原型模式——简历代码 初步实现

//客户端调用代码
public class main3 {
	public static void main(String[] args) {
		Resume a=new Resume("大鸟");
		a.SetPersonnalInfo("男", "29");
		a.SetWorkExperience("1998-2000", "xx公司");
		a.Display();
		Resume b=a;
		b.Display();
	}
}
 
class Resume {
	private String name;
	private String sex;
	private String timeArea;
	private String age;
	private String company;

	public Resume(String name) {
		this.name = name;
	}

	// 设置个人信息
	public void SetPersonnalInfo(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("姓名:"+ this.name+"\n"+"年龄:"+this.age+"\n"+"性别:"+this.sex);
		System.out.println("工作年限:"+this.timeArea+"\n"+"公司:"+this.company);
	}
}

//原型模式:用原型实例指定创建对象得种类,并且通过拷贝这些原型创建新的对象
//简单的原型实现——简历

public class main3 {
	public static void main(String[] args) throws CloneNotSupportedException {
		Resume a = new Resume("大鸟");
		a.SetPersonnalInfo("男", "29");
		a.SetWorkExperience("1998-2000", "xx公司");
		a.Display();
		Resume b = (Resume)a.Clone();
		b.SetPersonnalInfo("女", "25");
		b.SetWorkExperience("2020-2035", "互联网公司");
		b.Display();
	}
}
//简历
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 SetPersonnalInfo(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("姓名:" + this.name + "\n" + "年龄:" + this.age + "\n" + "性别:" + this.sex);
		System.out.println("工作年限:" + this.timeArea + "\n" + "公司:" + this.company);
	}

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

简历的浅复制实现

public class main3 {
	public static void main(String[] args) throws CloneNotSupportedException {
		Resume a = new Resume("大鸟");
		a.SetPersonnalInfo("男", "29");
		a.SetWorkExperience("1998-2000", "xx公司");
		a.Display();
		Resume b=(Resume)a.Clone();
		b.SetWorkExperience("2000-2020", "YY企业");
		a.Display();
		b.Display();
	}
}

//工作经历
class WorkExperience {
	private String workDate; // 工作时间
	private String company; // 工作地点
	// 设置工作时间

	public void setWorkDate(String workDate) {
		this.workDate = workDate;
	}

	// 返回工作时间
	public String getWorkDate() {
		return this.workDate;
	}

	// 设置工作地点
	public void setCompany(String company) {
		this.company = company;
	}

	// 返回工作地点
	public String getCompany() {
		return this.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 SetPersonnalInfo(String sex, String age) {
		this.sex = sex;
		this.age = age;
	}	
//设置工作经历
	public void SetWorkExperience(String workDate,String company) {
		this.work.setWorkDate(workDate);
		this.work.setCompany(company);
	}
	// 显示
	public void Display() {
		System.out.println("姓名:" + this.name + "\n" + "年龄:" + this.age + "\n" + "性别:" + this.sex);
		System.out.println("工作年限:" + this.work.getWorkDate() + "\n" + "公司:" + this.work.getCompany());
	}

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

**

简历的深复制

**

public class main3 {
	public static void main(String[] args) throws CloneNotSupportedException {
		Resume a = new Resume("大鸟");
		a.SetPersonnalInfo("男", "29");
		a.SetWorkExperience("1998-2000", "xx公司");
		Resume b = (Resume) a.Clone();
		b.SetWorkExperience("2000-2020", "YY企业");
		Resume c = (Resume) a.Clone();
		c.SetPersonnalInfo("女", "19");
		a.Display();
		System.out.println();
		b.Display();
		System.out.println();
		c.Display();
		System.out.println();
	}
}

//工作经历类
class WorkExperience implements Cloneable {
	private String workDate; // 工作时间
	private String company; // 工作地点
	// 设置工作时间

	public void setWorkDate(String workDate) {
		this.workDate = workDate;
	}

	// 返回工作时间
	public String getWorkDate() {
		return this.workDate;
	}

	// 设置工作地点
	public void setCompany(String company) {
		this.company = company;
	}

	// 返回工作地点
	public String getCompany() {
		return this.company;
	}

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

	// 设置个人信息
	public void SetPersonnalInfo(String sex, String age) {
		this.sex = sex;
		this.age = age;
	}

	// 构造函数
	private Resume(WorkExperience work) throws CloneNotSupportedException {
		this.work = (WorkExperience) work.clone();
	}

	// 设置工作经历
	public void SetWorkExperience(String workDate, String company) {
		this.work.setWorkDate(workDate);
		this.work.setCompany(company);
	}

	// 显示
	public void Display() {
		System.out.println("姓名:" + this.name + "\n" + "年龄:" + this.age + "\n" + "性别:" + this.sex);
		System.out.println("工作年限:" + this.work.getWorkDate() + "\n" + "公司:" + this.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;
		 */

		Resume resume = (Resume) super.clone();
		resume.work = (WorkExperience) work.clone();
		return resume;
	}
}
  • 从测试结果可以看出,这次给WorkExperience类添加clone函数之后, 修改原型对象的对象成员变量之后,克隆对象的对象成员变量没有发生改变,
  • 因为这次是真正的克隆了一份数据,而不是一个引用。
  • 原型模式应用场景:
  • 1、在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。
  • 2、希望对目标对象的修改不影响既有原型对象(深度克隆的时候完全互不影响)。
  • 3、 隐藏克隆操作的细节,很多时候,对对象本身的克隆需要设计到类本身的数据细节。**

建造者模式——设计小人

建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。
它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
建造者模式主要包括以下角色:
1.产品:包含多个组件的复杂对象,各组件由建造者来创建。
2.抽象建造者(builder):一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
3.具体建造者ConcreteBuilder,建造者的具体实现,完成复杂产品的各个部件的具体创建方法。
4.指挥者Director:它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。**

public class main3 {
	public static void main(String[] args) {
		PersonThinBuilder ptb=new PersonThinBuilder();
		PersonDirector pd=new PersonDirector(ptb);
		pd.CreatePerson();
	}
}

abstract class PersonBuider {

	public abstract void BuidHead();

	public abstract void BuidBody();

	public abstract void BuidArmLeft();

	public abstract void BuidArmRight();

	public abstract void BuidLegLeft();

	public abstract void BuidLegRight();
}
class PersonThinBuilder extends PersonBuider{
    
    public void BuidHead()
    {
        System.out.println("head");
    }
    public  void BuidBody()
    {
        System.out.println("Body");
    }
    public  void BuidArmLeft()
    {
        System.out.println("armleft");
    }
    public  void BuidArmRight()
    {
        System.out.println("armright");
    }
    public  void BuidLegLeft()
    {
        System.out.println("legleft");
    }
    public  void BuidLegRight()
    {
        System.out.println("legright");
    }
}
class PersonDirector
{
    private PersonBuider pb;
    public PersonDirector(PersonBuider pb)
    {
        this.pb = pb;
    }
    public void CreatePerson()
    {
        pb.BuidHead();
        pb.BuidBody();
        pb.BuidArmLeft();
        pb.BuidArmRight();
        pb.BuidLegLeft();
        pb.BuidLegRight();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sweet y y y y u

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值