原型 就好比:一个孙悟空的变出多个一样的孙悟空一样
* 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()*/
}
}
分享到:
相关推荐
在上面的屏幕截图中创建一个新的文件夹“ Game”,并将此仓库以文件夹名称“ protype-1”克隆到该文件夹中。 不要介意屏幕截图中的“ .import”文件夹,因为它是运行时生成的文件。 在“ protype-1”文件夹中...
【标题】"ajax 例子demo(protype)"是一个关于使用AJAX技术实现动态页面更新的示例项目,其中可能包含了对JavaScript原型(protype)概念的应用。这个项目旨在帮助开发者理解和学习如何利用AJAX来增强用户体验,减少...
原形网络(Prototypical Networks)基于PyTorch的实现 代码讲解原文:https://blog.csdn.net/weixin_41803874/article/details/92068250
1. **Prototype** Prototype是JavaScript中的一个核心概念,它允许对象共享属性和方法,从而实现面向对象编程。每个JavaScript对象都有一个`__proto__`属性,这个属性指向它的原型对象。当试图访问对象的一个属性时...
ProType 下一代JavaScript框架 您可以在上找到演示 可以在找到文档 如果需要帮助,可以转到文档,然后获取答案。 或者,您可以提交问题,我们将尽力尽快答复您。 支持 ProType是一个需要大量工作和精力的项目。 您...
这些算法执行以下操作:获取和处理数据矩阵,数据的描述性统计,确定最佳聚类数,使用k-原型方法聚类以及使用MANOVA对生成的聚类进行统计验证。 还使用R软件库中包含的Iris数据库提供了一个示例,该示例被广泛用于...
- **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-demo-web-project基本的product protype、基本的web framework。整体上,几点:Maven管理的Spring工程的搭建,基本的demo工程:说明文档:MyBatis 3.x基本demo工程:说明文档:Spring与Redis融合,基本demo...
扫描仪客户端Protype污染扫描仪如何使用?克隆仓库安装插件在镀Chrome中转到更多工具->扩展启用开发人员模式单击“加载解压缩”,然后选择克隆的repo文件夹。访问您要测试的网站它仅检查易受攻击的位置解析器。例子...
xhr.send('param1=value1¶m2=value2'); ``` 3. **`setRequestHeader()`**: 在发送请求前,可以使用此方法设置HTTP头部信息。例如: ```javascript xhr.setRequestHeader('Authorization', 'Bearer your-...
Array.prototype.sort方法是对数组进行排序, 该方法带...-1:1})) //这里,sort方法通过参数函数的返回值 1或者-1来决定是顺排还是倒排 还记得我以前和大家说过的 利用 Function.apply 方法来获取数组中的最大元素的
context[Object|opt]:目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1 methodName[String|opt]:匿名函数需显式传入目标函数名eg:this.Begin = function(){....}; } [bool]...
1. **数据库设计**:在设计企业库存管理系统时,数据库是核心组成部分。数据库设计包括概念模型设计和逻辑设计。概念模型设计通常使用实体-关系图(E-R图)来表示各个实体(如客户、产品、仓库等)及其之间的关系。...
1. **管理员表 (admin)**: - `AdminId`: 这是一个整型字段,长度为5,作为主键并且自增,用于唯一标识每个管理员,通常在数据库中自增字段用于自动分配新记录的唯一ID。 - `adminNov`: 管理员账号,采用变长字符...
sun开发的IP-PBX源代码,这个是SIP软交换系统ProType。
1、基于console的devtool检测 有些网站会用console来检测是否打开了F12(开发者工具),所以直接hook console 对象 让所有输出失效,已达到过检测的目的。 2、基于pushState的卡浏览器 有些网站会不停的往Chrome...
1. 定义一个实现IDispatach接口的COM类,这是所有BHO必须实现的接口,用于与宿主(即IE浏览器)进行通信。 2. 实现IBrowserService接口,这是BHO的核心接口,其中的成员函数可以让你注册事件监听器,例如...
- **官网地址**:http://www.epson.com.cn/tech_support/download/software_list.asp?columnid=384&isClick=yes&protype=&product=&keyword= - **简介**:爱普生(EPSON)是一家日本公司,以其高质量的喷墨打印机...
功能-js-101 使用学习函数 随机笔记 高阶函数是将另一个函数作为参数的函数或返回另一个函数的函数。... Array.protype.reduce对数组中的每个元素调用回调函数,并将其保存在previousValue (回调的第一个参数)中。