专栏首页OSChina设计模式-原型模式

设计模式-原型模式

package com.shi.design.prototype;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * @author shiye
 *
 */
public class Sleep implements Cloneable,Serializable{
	
	private String name;
	
	private String age;
	
	private String add;
	
	//对象中有一个引用对象类型的羊
	private Sleep friend;

	@Override
	public String toString() {
		return "Sleep [name=" + name + ", age=" + age + ", add=" + add + ", friend=" + friend + ", getName()="
				+ getName() + ", getAge()=" + getAge() + ", getAdd()=" + getAdd() + ", getFriend()=" + getFriend()
				+ ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
				+ "]";
	}


	public Sleep(String name, String age, String add, Sleep friend) {
		super();
		this.name = name;
		this.age = age;
		this.add = add;
		this.friend = friend;
	}


	public String getName() {
		return name;
	}


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


	public String getAge() {
		return age;
	}


	public void setAge(String age) {
		this.age = age;
	}


	public String getAdd() {
		return add;
	}


	public void setAdd(String add) {
		this.add = add;
	}


	public Sleep getFriend() {
		return friend;
	}


	public void setFriend(Sleep friend) {
		this.friend = friend;
	}

	//深拷贝的俩重方式
	//方式一 :使用自己重写父方法colne方法实现克隆
	@Override
	protected Object clone() throws CloneNotSupportedException {
		Sleep sleep = (Sleep)super.clone();//实现浅拷贝
		if(sleep.getFriend() != null) {
			sleep.setFriend((Sleep)sleep.getFriend().clone()); //引用对象需要自己实现拷贝
		}
		return sleep;
	}
	
	// 方式二:通过序列化的方式实现深拷贝 (推荐使用 效率高)
	public Object deepClone() {
		
		Sleep copyObj = null;
		
		//1 创建流对象
		ByteArrayOutputStream bos = null;
		ObjectOutputStream oos = null;
		ByteArrayInputStream bis = null;
		ObjectInputStream ois = null;
		
		try {
			//2 序列化
			bos = new ByteArrayOutputStream();
			oos = new ObjectOutputStream(bos);
			oos.writeObject(this);
			
			//3 反序列化
			bis = new ByteArrayInputStream(bos.toByteArray());
			ois = new ObjectInputStream(bis);
			copyObj = (Sleep)ois.readObject();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(bos != null ) {
					bos.close();
				}
				if(oos != null ) {
					oos.close();
				}
				if(bis != null ) {
					bis.close();
				}
				if(ois != null ) {
					ois.close();
				}
			} catch (IOException e2) {
				e2.printStackTrace();
			}
		}
		return copyObj;
	}

}
package com.shi.design.prototype;

public class Test1 {

	public static void main(String[] args) throws CloneNotSupportedException {
		Sleep sleep1 = new Sleep("小阳","12","地球村",new Sleep("朋友", "10", "不确定", null));
		Sleep sleep2 = (Sleep) sleep1.clone();
		
		System.out.println("使用 方式一 实现的深拷贝~~");
		System.out.println("sleep1.hashCode() = " + sleep1.hashCode() + "/sleep1.getFriend().hashCode() = " + sleep1.getFriend().hashCode());
		System.out.println("sleep2.hashCode() = " + sleep2.hashCode() + "/sleep2.getFriend().hashCode() = " + sleep2.getFriend().hashCode());
	
		System.out.println("使用 方式二 实现的深拷贝~~");
		Sleep sleep3 = (Sleep)sleep1.deepClone();
		System.out.println("sleep3.hashCode() = " + sleep3.hashCode() + "/sleep3.getFriend().hashCode() = " + sleep3.getFriend().hashCode());
	}

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot整合外部servelt容器

    用户5927264
  • 设计模式--单例模式

    用户5927264
  • Springboot 整合jpa的使用

    用户5927264
  • Java Lamada

    -->map: 入参 Function 对象,将此流中的元素依次作用于传入的 Function,然后返回新的数据流。

    WindWant
  • SAP人工智能服务Recast.AI的一个简单例子

    我创建了一个名为get-product-infomation的机器学习模型,用"Add an expression"下面的这么多句子去喂这个模型:

    Jerry Wang
  • 盈利的拼多多占据“五环内”了吗?

    近日,拼多多Q3财报发布。根据财报显示,拼多多Q3营收142.1亿元,同比增长89%;Non-GAAP(非美国通用会计准则)下,拼多多归属普通股东的净利润首次转...

    灵猫财经
  • 【Java】25 Stream 流

    我们需要筛选出集合中元素包含“叁”的元素,但是我们却遍历了元素集合,这无疑是累赘的。

    Demo_Null
  • 如何自动化测试 React Native 项目 (上篇) - 核心思想与E2E自动化

    React Native (RN) 是 Facebook 开源的跨平台应用开发框架,由于 RN 提供的高效直观的跨平台开发模式和不错的性能,我们在开发 Glow...

    Java帮帮
  • ThinkPHP5与单元测试PHPUnit使用详解

    thinkphp5.0 是 tp 发展路线第一个支持 composer 的。tp 有自己的载入机制,composer 也有自己的载入机制。

    砸漏
  • 被JDK坑的没商量?来试试这些方法吧

    jdk作为我们每天必备的调用类库,里面大量提供了基础类供我们使用.可以说离开jdk,我们的java代码寸步难行,jdk带给我们的便利可谓是不胜枚举,但同时这些方...

    用户2781897

扫码关注云+社区

领取腾讯云代金券