原型设计模式

本文介绍了原型设计模式,包括概念、浅拷贝和深拷贝的区别。在浅拷贝中,基本类型复制值,引用类型复制引用。深拷贝则为每个引用类型申请新空间并复制所有引用的对象。文中详细阐述了如何通过Object.clone方法实现浅拷贝,以及两种实现深拷贝的方法:手动复制引用类型和使用序列化、反序列化。
摘要由CSDN通过智能技术生成

1、概念

原型模式是一种创建型设计模式,允许一个对象创建另外一个可定制的对象,无需知道创建的细节。

2、浅拷贝和深拷贝

  • 浅拷贝:对于基本数据类型的成员变量,浅拷贝会直接进行值拷贝,也就是将该属性复制一份给新的对象;引用数据类型的成员变量(数组或者对象),那么浅拷贝会进行引用传递,也就是将该成员变量的引用值复制一份给新的对象。
  • 深拷贝:对于基本数据类型的成员变量,将该属性复制一份给新的对象;为每个引用数据类型的成员变量申请空间,并复制每个成员变量所引用的对象,直到该对象可到的所有对象。

3、实现

3.1、浅拷贝

借助Object类的clone方法,可以简单实现对象的复制。(但是clone方法是实现的浅拷贝,如果要实现深拷贝,还需要写代码实现)

  • 实现Cloneable接口。
  • 重写clone方法,并修改方法访问级别为public。
package com.mine.design.prototype;

public class Person implements Cloneable {
   
	private String name;
	private int age;
	private String sex;
	private String country;
	private Phone phone;

	public String getName() {
   
		return name;
	}

	public void setName(String name) {
   
		this.name = name;
	}

	public int getAge() {
   
		return age;
	}

	public void setAge(int age) {
   
		this.age = age;
	}

	public String getSex() {
   
		return sex;
	}

	public void setSex(String sex) {
   
		this.sex = sex;
	}

	public String getCountry() {
   
		return country;
	}

	public void setCountry(String country) {
   
		this.country = country;
	}

	public Phone getPhone() {
   
		return phone;
	}

	public void setPhone(Phone phone) {
   
		this.phone = phone;
	}

	@Override
	public String toString() {
   
		return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", country=" + country + ", phone=" + phone
				+ "]";
	}

	@Override
	public Object clone() throws CloneNotSupportedException {
   
		return super.clone();
	}
}
package com.mine.design.prototype;

public class Phone {
   
	private String brand;
	private String type;

	public String getBrand() {
   
		return brand;
	}

	public void setBrand(String brand) {
   
		this.brand = brand;
	}

	public String getType() {
   
		return type;
	}

	public void setType(String type) {
   
		this.type = type;
	}
}
package com.mine.design.prototype;

public class Client {
   

	public static void main(String[] args) throws Exception {
   
		Person p = new Person();
		p.setName("西施");
		p.s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值