原型模式

本文介绍了原型模式(克隆模式)的概念及其应用场景,对比了浅克隆与深克隆的区别,并提供了Java实现示例。浅克隆下,对象复制后部分属性改变会影响原对象;而深克隆则完全独立,确保了对象间不相互影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原型模式(克隆模式):1通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式

2 以某个对象为原型,复制新的对象。避免了重新执行构造过称步骤

3 克隆出的新对象不会改变原型对象,然后再修改克隆的值;new创建的对象属性采用的是默认值

实现:Cloneable接口和Clone()方法


浅克隆:复制之后,若s1的属性改变,则s2的属性也会改变

package prototype;

import java.util.Date;

public class Sheep implements Cloneable {
	private String name;
	private Date birthday;

	@Override
	protected Object clone() throws CloneNotSupportedException {
		Object obj = super.clone(); // 直接调用Object对象的clone()方法;
		return obj;
	}

	public String getName() {
		return name;
	}

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

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public Sheep(String name, Date birthday) {
		super();
		this.name = name;
		this.birthday = birthday;
	}

	public Sheep() {

	}

}

package prototype;

import java.util.Date;

//测试原型系统(浅克隆)
public class Client {
	public static void main(String[] args) throws Exception {
		Date d = new Date(12312321331L);
		Sheep s1 = new Sheep("多利", d);
		System.out.println(s1);
		System.out.println(s1.getName());
		System.out.println(s1.getBirthday());

		d.setTime(2343243223L);
		System.out.println(s1.getBirthday());

		Sheep s2 = (Sheep) s1.clone();
		System.out.println(s2);
		System.out.println(s2.getName());
		System.out.println(s2.getBirthday());

	}

}


深克隆(联同属性一起克隆):即使s1的属性改变,复制之后s2的属性不会变

package prototype;

import java.util.Date;

public class Sheep2 implements Cloneable {
	private String name;
	private Date birthday;

	@Override
	protected Object clone() throws CloneNotSupportedException {
		Object obj = super.clone(); // 直接调用Object对象的clone()方法;

		// 添加以下代码实现深复制(deep Clone)
		Sheep2 s = (Sheep2) obj;
		s.birthday = (Date) this.birthday.clone();// 把属性也进行复制
		return obj;
	}

	public String getName() {
		return name;
	}

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

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public Sheep2(String name, Date birthday) {
		super();
		this.name = name;
		this.birthday = birthday;
	}

	public Sheep2() {

	}

}
package prototype;

import java.util.Date;

//原型模式(深复制)
public class Client2 {

	public static void main(String[] args) throws Exception {
		Date d = new Date(12312321331L);
		Sheep2 s1 = new Sheep2("多利", d);
		Sheep2 s2 = (Sheep2) s1.clone();// 实现深复制。s2对象的birthday是一个新对象

		System.out.println(s1);
		System.out.println(s1.getName());
		System.out.println(s1.getBirthday());

		d.setTime(2343243223L);
		System.out.println(s1.getBirthday());

		System.out.println(s2);
		System.out.println(s2.getName());
		System.out.println(s2.getBirthday());

	}

}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值