`

原型模式(protype)-1

阅读更多

原型 就好比:一个孙悟空的变出多个一样的孙悟空一样
  * java的构件模型直接支持原始模式的。
  * 所有的javaBean都继承Object,而Object类提供一个clone方法
  * 可以将一个JavaBean对象复制一份。
  * 但这个JavaBean必须实现一个标识接口:Cloneable.
  * -----------------------
  * 克隆满足的条件:
  * clone方法将对象复制一份并返还给调用者。所谓“复制”的含义与clone方法是怎么
  * 实现的有关。一般而言,clone方法满足以下的描述
  * 1.对任何的对象X,都有:X.clone()!=X 克隆对象与原对象不是同一个对象
  * 2.  X.clone().getClass() == X.getClass() 克隆对象与原对象的类型是一样的
  * 3.  如果对象X的equals()方法定义恰当的话,那么X.clone().equals(X) 是成立的。
  * (Object类中equals()方法的默认实现是return (this==obj) 也就是说,当两个变量指向同一个对象时才返回true)

 

模式实现-浅复制和深复制

如下例子:

/**
 * 孙大圣
 */
public class Monkey implements Cloneable, Serializable {

	private static final long serialVersionUID = -5655707590382020734L;

	private int height;
	private int weight;
	private GoldRingedStaff staff;
	private Date birthDate;

	public Monkey() {
		this.birthDate = new Date();
		this.staff = new GoldRingedStaff();
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}

	public GoldRingedStaff getStaff() {
		return staff;
	}

	public void setStaff(GoldRingedStaff staff) {
		this.staff = staff;
	}

	public Date getBirthDate() {
		return birthDate;
	}

	public void setBirthDate(Date birthDate) {
		this.birthDate = birthDate;
	}

	//深克隆
	// 利用串行化做深复制 (把对象写到流里的过程是串行化(Serilization)过程)
	public Object deepClone() throws IOException, ClassNotFoundException {

		// 将对象写到流里
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		oos.writeObject(this);

		// 从流里读回来
		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bais);
		return ois.readObject();

	}

	//这是浅克隆
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return (Monkey) super.clone();
	}
	
	@Override
	public String toString() {
		return "birthDate=" + birthDate + " height=" + height + " weight="
				+ weight + " GoldRingedStaff=" + staff;
	}
}

 

//金箍棒
public class GoldRingedStaff implements Cloneable, Serializable {

	private static final long serialVersionUID = -206209645135740010L;

	// 高度
	private float height = 100.0F;
	// 直径
	private float diameter = 100.0f;

	public GoldRingedStaff() {
	}

	// 增长和增大
	public void grow() {
		this.diameter *= 2.0;
		this.height *= 2.0;
	}
	
	// 缩小和变短
	public void shrink() {
		this.diameter /= 2.0;
		this.height /= 2.0;
	}
	
	//移动
	public void move(){
	}

	public float getHeight() {
		return height;
	}

	public void setHeight(float height) {
		this.height = height;
	}

	public float getDiameter() {
		return diameter;
	}

	public void setDiameter(float diameter) {
		this.diameter = diameter;
	}
	
	@Override
	public String toString() {
		return "height=" + height + " diameter" + diameter;
	}
}

 

//测试
public class MainApp {

	private Monkey money = new Monkey();

	void change() throws Exception {
		Monkey copyMoney;
		Thread.sleep(1000);
		copyMoney = (Monkey) money.clone();
		System.out.println("    Money="+money);
		System.out.println("copyMoney="+copyMoney);
		System.out.println("money==copyMoney?"+(money==copyMoney));
		System.out.println((money.getStaff() == copyMoney.getStaff())?"money.getStaff() == copyMoney.getStaff()":"money.getStaff() != copyMoney.getStaff()");
		
		Thread.sleep(1000);
		System.out.println("---------------deep Copy------------------------------------");
		copyMoney = (Monkey) money.deepClone();
		System.out.println("    Money="+money);
		System.out.println("copyMoney="+copyMoney);
		System.out.println("money==copyMoney?"+(money==copyMoney));
		System.out.println((money.getStaff() == copyMoney.getStaff())?"money.getStaff() == copyMoney.getStaff()":"money.getStaff() != copyMoney.getStaff()");
		
	}

	/**
	 * 
	 * 浅复制
	 * 只对当前象进行复制,而不对其引用对象进行提制
	 * 这说明复制出来的东西不是同一个对象,但是这两个对象所引用的对象却是同一个
	 * 
	 * 深复制
	 * 所要复制的对象都要实现 Serializable接口和Cloneable接口
	 * 这说明复制出来的东西不是同一个对象,而且这两个对象所引用的对象也不是同一个对象
	 */
	public static void main(String[] args) {
		try {
			new MainApp().change();
		} catch (Exception e) {
			e.printStackTrace();
		}
		//out put 输出如下
	    /*Money=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
	    copyMoney=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
	    money==copyMoney?false
	    money.getStaff() == copyMoney.getStaff()
	    ---------------deep Copy------------------------------------
	        Money=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
	    copyMoney=birthDate=Tue Dec 07 00:28:21 CST 2010 height=0 weight=0 GoldRingedStaff=height=100.0 diameter100.0
	    money==copyMoney?false
	    money.getStaff() != copyMoney.getStaff()*/
	}
}

 

分享到:
评论

相关推荐

    prototype-1:具有播放器控件的原型,需要删除不需要的资产和脚本文件

    在上面的屏幕截图中创建一个新的文件夹“ Game”,并将此仓库以文件夹名称“ protype-1”克隆到该文件夹​​中。 不要介意屏幕截图中的“ .import”文件夹,因为它是运行时生成的文件。 在“ protype-1”文件夹中...

    ajax 例子demo(protype)

    【标题】"ajax 例子demo(protype)"是一个关于使用AJAX技术实现动态页面更新的示例项目,其中可能包含了对JavaScript原型(protype)概念的应用。这个项目旨在帮助开发者理解和学习如何利用AJAX来增强用户体验,减少...

    原形网络(Prototypical Networks)基于PyTorch的实现

    原形网络(Prototypical Networks)基于PyTorch的实现 代码讲解原文:https://blog.csdn.net/weixin_41803874/article/details/92068250

    Protytype&正则等速查手册HandBood系列(By FengGe整理)

    1. **Prototype** Prototype是JavaScript中的一个核心概念,它允许对象共享属性和方法,从而实现面向对象编程。每个JavaScript对象都有一个`__proto__`属性,这个属性指向它的原型对象。当试图访问对象的一个属性时...

    ProType:一种新型的面向对象的前端JS框架

    ProType 下一代JavaScript框架 您可以在上找到演示 可以在找到文档 如果需要帮助,可以转到文档,然后获取答案。 或者,您可以提交问题,我们将尽力尽快答复您。 支持 ProType是一个需要大量工作和精力的项目。 您...

    基于R语言的k-prototypes聚类算法.zip

    这些算法执行以下操作:获取和处理数据矩阵,数据的描述性统计,确定最佳聚类数,使用k-原型方法聚类以及使用MANOVA对生成的聚类进行统计验证。 还使用R软件库中包含的Iris数据库提供了一个示例,该示例被广泛用于...

    F821-SIP调测脚本

    - **add-digitmapmgid1servicetype2das1dgtnamesipdgtmap[EF][0-9][0-9E].F|EExx|EFxxF|FE99|FF|x.**:添加数字映射表,ID为1,服务类型为SIP(2),数字映射规则为[EF][0-9][0-9E].F|EExx|EFxxF|FE99|FF|x....

    simple-web-demo:产品原型、网络框架

    simple-demo-web-project基本的product protype、基本的web framework。整体上,几点:Maven管理的Spring工程的搭建,基本的demo工程:说明文档:MyBatis 3.x基本demo工程:说明文档:Spring与Redis融合,基本demo...

    PPScan:客户端原型污染扫描仪

    扫描仪客户端Protype污染扫描仪如何使用?克隆仓库安装插件在镀Chrome中转到更多工具->扩展启用开发人员模式单击“加载解压缩”,然后选择克隆的repo文件夹。访问您要测试的网站它仅检查易受攻击的位置解析器。例子...

    XMLHttpRequest方法和属性API

    xhr.send('param1=value1&param2=value2'); ``` 3. **`setRequestHeader()`**: 在发送请求前,可以使用此方法设置HTTP头部信息。例如: ```javascript xhr.setRequestHeader('Authorization', 'Bearer your-...

    深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法

    Array.prototype.sort方法是对数组进行排序, 该方法带...-1:1})) //这里,sort方法通过参数函数的返回值 1或者-1来决定是顺排还是倒排 还记得我以前和大家说过的 利用 Function.apply 方法来获取数组中的最大元素的

    [hook.js]通用Javascript函数钩子

    context[Object|opt]:目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1 methodName[String|opt]:匿名函数需显式传入目标函数名eg:this.Begin = function(){....}; } [bool]...

    数据库课程设计--企业库存管理及web网上订购系统.doc

    1. **数据库设计**:在设计企业库存管理系统时,数据库是核心组成部分。数据库设计包括概念模型设计和逻辑设计。概念模型设计通常使用实体-关系图(E-R图)来表示各个实体(如客户、产品、仓库等)及其之间的关系。...

    数据字典1

    1. **管理员表 (admin)**: - `AdminId`: 这是一个整型字段,长度为5,作为主键并且自增,用于唯一标识每个管理员,通常在数据库中自增字段用于自动分配新记录的唯一ID。 - `adminNov`: 管理员账号,采用变长字符...

    sipcore_jain.rar_pbx_sipcore

    sun开发的IP-PBX源代码,这个是SIP软交换系统ProType。

    基于谷歌的反调试工具插件

    1、基于console的devtool检测 有些网站会用console来检测是否打开了F12(开发者工具),所以直接hook console 对象 让所有输出失效,已达到过检测的目的。 2、基于pushState的卡浏览器 有些网站会不停的往Chrome...

    浏览器信息截获之iehelper

    1. 定义一个实现IDispatach接口的COM类,这是所有BHO必须实现的接口,用于与宿主(即IE浏览器)进行通信。 2. 实现IBrowserService接口,这是BHO的核心接口,其中的成员函数可以让你注册事件监听器,例如...

    主流打印机驱动的官方下载地址.doc

    - **官网地址**:http://www.epson.com.cn/tech_support/download/software_list.asp?columnid=384&isClick=yes&protype=&product=&keyword= - **简介**:爱普生(EPSON)是一家日本公司,以其高质量的喷墨打印机...

    functional-js-101:通过functional-javascript-workshop学习函数式JavaScript

    功能-js-101 使用学习函数 随机笔记 高阶函数是将另一个函数作为参数的函数或返回另一个函数的函数。... Array.protype.reduce对数组中的每个元素调用回调函数,并将其保存在previousValue (回调的第一个参数)中。

Global site tag (gtag.js) - Google Analytics