设计模式(4)--原型模式

本文介绍了原型模式的概念及其在创建新对象时的作用,并详细解释了浅克隆和深克隆的区别,通过示例代码展示了如何实现这两种克隆方式。

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

原型模式,顾名思义,以某个对象为原型创建和原型对象相同或相似的新对象。新的被创建的对象占用内存空间和原型对象不同。也就是说,它就是个全新的对象。

原型模式和单例模式区分一下,同样得到一个新对象,原型模式创建的是一个全新的对象,而单例模式拿到的一直是相同的一个对象。

原型模式分为浅克隆和深克隆两种方式。

浅克隆:当原型对象被复制时只复制值类型的成员变量,不复制引用类型的成员变量。

深克隆:无论原型对象是值类型和引用类型,都复制一份给克隆对象。

示例代码如下:

Prototype类:

public abstract class Prototype {
 
	public abstract Prototype Clone();
}

ShallowClone(浅克隆)类:


public class ShallowClone extends Prototype{

	private Member member;
	private int i;
	
	public Member getMember() {
		return member;
	}

	public void setMember(Member member) {
		this.member = member;
	}

	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}

	@Override
	public Prototype Clone() {
		// TODO Auto-generated method stub
		ShallowClone sc = new ShallowClone();
		sc.i = 3;
		sc.member = this.member;
		return sc;
	}

}
class Member{
	
}

深克隆:

public class DeepClone extends Prototype{
	private Member member;
	private int i;
	
	public Member getMember() {
		return member;
	}

	public void setMember(Member member) {
		this.member = member;
	}

	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}

	@Override
	public Prototype Clone() {
		// TODO Auto-generated method stub
		DeepClone dc = new DeepClone();
		dc.i = 2;
		dc.member = new Member();
		return dc;
	}

}


Main类:

public class Main {

	public static void main(String[] args) {
		//浅克隆
		ShallowClone sc = new ShallowClone();
		ShallowClone sc2 = (ShallowClone)sc.Clone();
		System.out.println(sc == sc2);
		System.out.println(sc.getI() == sc2.getI());
		System.out.println(sc.getMember() == sc2.getMember());
		//深克隆
		DeepClone dc = new DeepClone();
		DeepClone dc2 = (DeepClone)dc.Clone();
		System.out.println(dc == dc2);
		System.out.println(dc.getI() == dc2.getI());
		System.out.println(dc.getMember() == dc2.getMember());
	}
}
运行结果:

false
false
true


false
false
false


说明:

对象比较为false,说明不是一个对象,浅克隆Member相同,指向相同内存地址,值类型成员变量进行复制,可以独立变化不影响原对象。深克隆Member不同,指向不同内存地址,值类型也进行了复制,可以独立进行变化不影响原对象。

以上例子只是简单示例代码,希望能说明原型模式和两个克隆方式的思想,在JAVA或其他面向对象语言中都有其他好的代码对克隆进行控制或操作。

如有错误,欢迎指正

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值