Java学习笔记之--------原型模式

我们两清 提交于 2019-12-19 07:18:18

原型模式

通过new产生一个对象需要非常繁琐的数据准备或者访问权限,可以使用原型模式。原型模式就是Java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型模式的特点。原型模式的优势:效率高(直接克隆,避免了重新执行构造过程步骤)。

克隆和new类似,但是不同于new。new创建新的对象属性用的是默认值,克隆出的对象的属性值完全和原型对象相同。并且克隆出的新对象改变不会影响原型对象。然后,再修改克隆对象的值。

Prototype模式中实现起来最困难的地方就是内存复制操作,所幸在Java中提供了clone()方法替我们做了绝大一部分事情,这里需要注意的是,clone()方法是Object里面的,但是如果需要克隆类的对象,必须实现Cloneable接口。

原型模式demo

我们模仿克隆羊多利,实现一下羊的克隆,代码如下:

public class Sheep implements Cloneable{
	private String sname;
	private Date birthday;
	@Override
	protected Object clone() throws CloneNotSupportedException {
		//直接调用Object对象的clone()方法
		Object obj = super.clone();
                //添加以下代码实现深复制(deep clone)
		Sheep s = (Sheep) obj;
		s.birthday = (Date)this.birthday.clone();
		return obj;
	}
	public Sheep(String sname, Date birthday) {
		this.sname = sname;
		this.birthday = birthday;
	}
	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}
public class Client {
	public static void main(String[] args) throws CloneNotSupportedException {
		Date date = new Date(123123123L);
		Sheep sheep = new Sheep("小羊", date);
		Sheep s2 = (Sheep) sheep.clone();

		System.out.println(sheep);
		System.out.println(sheep.getSname());
		System.out.println(sheep.getBirthday());
		sheep.setBirthday(new Date(12345123L));
		System.out.println(sheep.getBirthday());

		s2.setSname("小小小小羊");
		System.out.println(s2);
		System.out.println(s2.getSname());
		System.out.println(s2.getBirthday());
	}
} 

执行结果如下:

可以看到,我们在复制出“小小小小羊”之后,再修改“小羊”对象的值,“小小小小羊”不受影响。说明两只羊的对象现在指向不同的对象,实现了深复制。如果是浅复制,修改“小羊”对象的值,“小小小小羊”对象的值将被影响。

原型模式类图

原型模式使用场景

Cloneable接口和Clone()

JavaScript中的继承里面的prototype

 

以上为原型模式的学习笔记,此文章为尚学堂视频的学习笔记+自己总结。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!