设计模式之原型模式(深浅拷贝的差别和写法)

一.什么是原型模式

原型模式就是从从一个对象创建再另外一个可定制对象,并且不需要知道创建的细节

二.原型模式怎么写

1.我们先来看看原型模式的UMLl类图
在这里插入图片描述
2.我们根据类图来写一写原型模式

public abstract class Prototype {
	public String name;

	public abstract void setName(String name);

	public abstract String getName();

	public abstract Prototype clonePro();
}

public class ConcretePrototype extends Prototype {

	@Override
	public String getName() {
		return name;
	}
	@Override
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public ConcretePrototype clonePro() {
		ConcretePrototype concretePrototype=new ConcretePrototype();
		concretePrototype.setName(this.name);
		return concretePrototype;
	}

}

客户端调用

public class Client {

	public static void main(String[] args) {
		Prototype prototype=new ConcretePrototype();
		prototype.setName("小明");
		System.out.println("对象:"+prototype+"对象属性:"+prototype.getName());
		Prototype clonePrototype=prototype.clonePro();
		System.out.println("对象:"+clonePrototype+"对象属性:"+clonePrototype.getName());
	
	}
}

我们将打印结果展示出来:
对象:com.seven.prototype.ConcretePrototype@15db9742对象属性:小明
对象:com.seven.prototype.ConcretePrototype@6d06d69c对象属性:小明
这样我们就克隆了原始的对象

三.深拷贝和浅拷贝

通过上面的例子,我相信都会写原型模式了,在来说说深浅拷贝的问题,首先我们要了解这个概念。
浅拷贝:如果是基本数据类型,直接复制,如果是引用数据类型则赋值地址。也就是浅拷贝中,如果拷贝对象的引用数据类型的里面数据改变了,则都会改变,
深拷贝:如果是引用数据的拷贝,则重新创建,各种独立,修改时不影响其他的克隆对象

1.我们通过Cloneable 来实现浅拷贝

/**
 * @author Seven 通过Cloneable浅拷贝
 *
 */
public class Prototype implements Cloneable {

		private class MyPrototype implements Serializable
	{
		
	}
	private String name;
	public MyPrototype MyPrototype=new MyPrototype();

	public String getName() {
		return name;
	}

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

	@Override
	protected Prototype clone() throws CloneNotSupportedException {

		Object obj = null;
		try {
			obj = super.clone();
			return (Prototype) obj;
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			System.out.println("不支持克隆方法!");
			return null;
		}
	}
}

2.我们通过序列化实现深拷贝


public class Prototype implements  Serializable{

	private class MyPrototype implements Serializable
	{
		
	}
	private String name;
	public MyPrototype MyPrototype=new MyPrototype();

	public String getName() {
		return name;
	}

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

	/** 深拷贝
	 * @return
	 * @throws Exception
	 */
	public Prototype deepClone() throws Exception {

		// 将对象写入流中,
		ByteArrayOutputStream byteos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(byteos);
		oos.writeObject(this);
		// 将对象取出来
		ByteArrayInputStream bi = new ByteArrayInputStream(byteos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bi);

		return (Prototype) ois.readObject();
	}
}

下面是打印

浅拷贝对象:com.seven.prototype.clone.Prototype@15db9742属性:小浅,com.seven.prototype.clone.Prototype M y P r o t o t y p e @ 6 d 06 d 69 c 浅 拷 贝 对 象 : c o m . s e v e n . p r o t o t y p e . c l o n e . P r o t o t y p e @ 7852 e 922 属 性 : 小 浅 , c o m . s e v e n . p r o t o t y p e . c l o n e . P r o t o t y p e MyPrototype@6d06d69c 浅拷贝对象:com.seven.prototype.clone.Prototype@7852e922属性:小浅,com.seven.prototype.clone.Prototype MyPrototype@6d06d69c:com.seven.prototype.clone.Prototype@7852e922:,com.seven.prototype.clone.PrototypeMyPrototype@6d06d69c
深拷贝对象:com.seven.prototype.clone.Prototype@4e25154f,属性:小深,com.seven.prototype.clone.Prototype M y P r o t o t y p e @ 70 d e a 4 e 深 拷 贝 对 象 : c o m . s e v e n . p r o t o t y p e . c l o n e . P r o t o t y p e @ 3 b 9 a 45 b 3 , 属 性 : 小 浅 , c o m . s e v e n . p r o t o t y p e . c l o n e . P r o t o t y p e MyPrototype@70dea4e 深拷贝对象:com.seven.prototype.clone.Prototype@3b9a45b3,属性:小浅,com.seven.prototype.clone.Prototype MyPrototype@70dea4e:com.seven.prototype.clone.Prototype@3b9a45b3,:,com.seven.prototype.clone.PrototypeMyPrototype@7699a589

我们可以通过打印看出来,深浅拷贝的差别也就是对引用对象拷贝的差别

四.总结

本文介绍了什么是原型模式以及原型模式的写法,深浅拷贝的区别以及实现方式,如果本文对你有用,可以点个赞,如果有不正之处,欢迎留下你的评论,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值