1.案例一

学生复制

package Prototype;

/**
* Created by Jim on 2016/10/1.
*/
public class Student implements Cloneable{
private String stuName;
private String stuSex;
private int stuAge;
private String stuMajor;
private String stuCollege;
private String stuUniversity; public Student(String stuName,String stuSex,int stuAge,String stuMajor,String stuCollege,String stuUniversity) { // 构造函数
this.stuName = stuName;
this.stuSex = stuSex;
this.stuAge = stuAge;
this.stuMajor = stuMajor;
this.stuCollege = stuCollege;
this.stuUniversity = stuUniversity;
} public void setStuName(String stuName) {
this.stuName = stuName;
} public void setStuSex(String stuSex) {
this.stuSex = stuSex;
} public void setStuAge(int stuAge) {
this.stuAge = stuAge;
} public void setStuMajor(String stuMajor) {
this.stuMajor = stuMajor;
} public void setStuCollege(String stuCollege) {
this.stuCollege = stuCollege;
} public void setStuUniversity(String stuUniversity) {
this.stuUniversity = stuUniversity;
} public String getStuName() {
return this.stuName;
} public String getStuSex() {
return this.stuSex;
} public int getStuAge() {
return this.stuAge;
} public String getStuMajor() {
return this.stuMajor;
} public String getStuCollege() {
return this.stuCollege;
} public String getStuUniversity() {
return this.stuUniversity;
} public Student clone() { // 实现克隆
Student cpStudent = null;
try{
cpStudent=(Student)super.clone();
}catch (CloneNotSupportedException e) { }
return cpStudent;
}
} // 继续写类
class MainClass
{
public static void main(String args[]) {
Student stu1,stu2,stu3;
stu1 = new Student("张无忌","男",24,"软件","信息工程学院","南京财经大学"); // 使用原型
stu2 = stu1.clone();
stu2.setStuName("杨过"); stu3 = stu1.clone();
stu3.setStuName("小龙女");
stu3.setStuSex("女"); System.out.print("姓名:" + stu1.getStuName());
System.out.print(",性别:" + stu1.getStuSex());
System.out.print(",年龄:" + stu1.getStuAge());
System.out.print(",专业:" + stu1.getStuMajor());
System.out.print(",学院:" + stu1.getStuCollege());
System.out.print(",大学:" + stu1.getStuUniversity());
System.out.println(); System.out.print("姓名:" + stu2.getStuName());
System.out.print(",性别:" + stu2.getStuSex());
System.out.print(",年龄:" + stu2.getStuAge());
System.out.print(",专业:" + stu2.getStuMajor());
System.out.print(",学院:" + stu2.getStuCollege());
System.out.print(",大学:" + stu2.getStuUniversity());
System.out.println(); System.out.print("姓名:" + stu3.getStuName());
System.out.print(",性别:" + stu3.getStuSex());
System.out.print(",年龄:" + stu3.getStuAge());
System.out.print(",专业:" + stu3.getStuMajor());
System.out.print(",学院:" + stu3.getStuCollege());
System.out.print(",大学:" + stu3.getStuUniversity());
System.out.println();
}
}

执行结果:

姓名:张无忌,性别:男,年龄:24,专业:软件,学院:信息工程学院,大学:南京财经大学

姓名:杨过,性别:男,年龄:24,专业:软件,学院:信息工程学院,大学:南京财经大学

姓名:小龙女,性别:女,年龄:24,专业:软件,学院:信息工程学院,大学:南京财经大学

2.邮件与附件

附件类

package Prototype;

/**
* Created by Jim on 2016/10/1.
*/
public class Attachment {
public void download() {
System.out.println("下载附件");
}
}

邮件类

package Prototype;

/**
* Created by e550 on 2016/10/1.
*/
public class Email implements Cloneable{
private Attachment attachment = null; public Email() {
this.attachment = new Attachment();
} public Object clone() {
Email clone = null;
try{
clone=(Email)super.clone();
}catch (CloneNotSupportedException e){
System.out.println("Clone failure!");
}
return clone;
} public Attachment getAttachment() {
return this.attachment;
} public void display() {
System.out.println("查看邮件");
}
}

客户端

package Prototype;

/**
* Created by e550 on 2016/10/1.
*/
public class Client {
public static void main(String a[]) {
Email email,cpEmail;
email = new Email();
cpEmail = (Email)email.clone(); System.out.println("email==cpEmail?");
System.out.println(email==cpEmail); System.out.println("email.getAttachment==cpEmail.getAttachment?");
System.out.println(email.getAttachment()==cpEmail.getAttachment());
}
}

执行结果

email==cpEmail?
false
email.getAttachment==cpEmail.getAttachment?
true

说明:

这种克隆,没有把引用的变量克隆出来。

3.改造邮件类,通过流实现深克隆

附件类

package Prototype.deepClone;
import java.io.*; /**
* Created by e550 on 2016/10/1.
*/
public class Attachment implements Serializable{
public void download() {
System.out.println("下载附件");
}
}

邮件类

package Prototype.deepClone;
import java.io.*;
/**
* Created by e550 on 2016/10/1.
*/
public class Email implements Serializable{
private Attachment attachment = null;
public Email() {
this.attachment = new Attachment();
} public Object deepClone() throws IOException , ClassNotFoundException, OptionalDataException
{
// 将对象写入流中
ByteArrayOutputStream bao = new ByteArrayOutputStream();
ObjectOutputStream oss = new ObjectOutputStream(bao);
oss.writeObject(this); //将对象从流中取出
ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return(ois.readObject());
} public Attachment getAttachment() {
return this.attachment;
} public void display() {
System.out.println("查看邮件");
} }

客户端类

package Prototype.deepClone;

public class Client
{
public static void main(String a[])
{
Email email,copyEmail=null; email=new Email(); try{
copyEmail=(Email)email.deepClone();
}
catch(Exception e)
{
e.printStackTrace();
} System.out.println("email==copyEmail?");
System.out.println(email==copyEmail); System.out.println("email.getAttachment==copyEmail.getAttachment?");
System.out.println(email.getAttachment()==copyEmail.getAttachment());
}
}

执行结果

email==copyEmail?
false
email.getAttachment==copyEmail.getAttachment?
false

点评

通过流实现了深克隆,把对象中的值类型和引用类型都克隆了。

这种方式比较复杂一点,可以根据实际情况来选择使用。

JAVA设计模式之【原型模式】的更多相关文章

  1. JAVA 设计模式之原型模式

    目录 JAVA 设计模式之原型模式 简介 Java实现 1.浅拷贝 2.深拷贝 优缺点说明 1.优点 2.缺点 JAVA 设计模式之原型模式 简介 原型模式是六种创建型设计模式之一,主要应用于创建相同 ...

  2. java设计模式4——原型模式

    java设计模式4--原型模式 1.写在前面 本节内容与C++语言的复制构造函数.浅拷贝.深拷贝极为相似,因此建议学习者可以先了解C++的该部分的相关知识,或者学习完本节内容后,也去了解C++的相应内 ...

  3. java设计模式之原型模式

    原型模式概念 该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.java中复制通过clone()实现的.clone中涉及深.浅复制.深.浅复制的概念如下: ⑴浅复制 ...

  4. java设计模式之五原型模式(Prototype)

    原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.本小结会通过对象的复制,进行讲解.在Java中 ...

  5. JAVA设计模式之 原型模式【Prototype Pattern】

    一.概述: 使用原型实例指定创建对象的种类,而且通过拷贝这些原型创建新的对象. 简单的说就是对象的拷贝生成新的对象(对象的克隆),原型模式是一种对象创建型模式. 二.使用场景: 创建新的对象能够通过对 ...

  6. JAVA 设计模式之 原型模式详解

    原型模式(Prototype Pattern)是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式利用的是克隆的原理,创建新的对象,JDK提供的Cloneable 和JSON. ...

  7. JAVA设计模式之原型模式(prototype)

    原型模式: 原型模式又叫克隆模式 Java自带克隆模式 实现克隆模式必须实现Cloneable 接口,如果不实现会发生java.lang.CloneNotSupportedException异常 当某 ...

  8. 孙悟空的身外身法术使用了Java设计模式:原型模式

    目录 定义 意图 主要解决问题 何时使用 优缺点 结构 简单形式的原型模式 登记形式的原型模式 两种形式比较 浅克隆和深克隆 孙悟空的身外身法术 浅克隆实现 深克隆实现 定义 原型模式属于对象的创建型 ...

  9. 设计模式_11_原型模式(prototype)深拷贝、浅拷贝

    设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...

  10. 【GOF23设计模式】原型模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口  浅复制 package com.test.prot ...

随机推荐

  1. table合并单元格 colspan(跨列)和rowspan(跨行)

    colspan和rowspan这两个属性用于创建特殊的表格. colspan是“column span(跨列)”的缩写.colspan属性用在td标签中,用来指定单元格横向跨越的列数: 在浏览器中将显 ...

  2. jquery.slides.js

    http://slidesjs.com/#docs 一款强大的,专业的幻灯片组件,全方位对幻灯片的速度..全方位的控制: $(function(){ $("#slides").sl ...

  3. RDS中的.frm和.ibd文件转换为sql文件

    --- 转自他人 mysql存储在磁盘中,各种天灾人祸都会导致数据丢失.大公司的时候我们常常需要做好数据冷热备,对于小公司来说要做好所有数据备份需要支出大量的成本,很多公司也是不现实的.万一还没有做好 ...

  4. CSS——清除浮动的六种解决方案

    内容的高度撑起父元素容器的高度,效果图如下 HTML和CSS代码如下 给p标签加上浮动以后,p{float:left:},此时DIV塌陷,两段内容同行显示,效果如下: 解决方案一:给前面一个父元素设置 ...

  5. WEB笔记-1、HTML 标记与文档结构

    1.HTML 标记与文档结构   1.1 块级(block)和行内(inline)标签   块级标签 <h1>-<h6> : 6级标签,h1表示最重要(h1 不仅仅是最大最突出 ...

  6. MongoDB(二)创建更新删除文档

    插入并保存文档操作 用insert向目标集合插入文档,如果没有_id键则会自动添加.最后自动保存. >db.foo.insert({"bar":"baz" ...

  7. Windows Phone - 按钮/button 控件

    System.Windows.Controls.Button   button控件一.button控件的各种样式的展示可以通过 …… 来给控件定义公共的样式调用样式的方法:在Button控件上添加样式 ...

  8. 写给VC++ Windows开发的初学者 一片不错的博文

    不知不觉2010年都过了半年了,想来我学C语言已经12个年头了(从1998年开始),用VC++也有11年了,最早使用Turbo C2.0 ,也学过汇编,后来使用Borland C++3.0 .Micr ...

  9. VC++抛出自定义编译期异常的指令

    #error 即可, 抛出消息是 #pragma message 最新的还有static_assert有一些用 一下子忘了网上居然搜不到...尝试了 关键字vc++.vc.vs.msvc +  抛出编 ...

  10. (转)基于MVC4+EasyUI的Web开发框架经验总结(5)--使用HTML编辑控件CKEditor和CKFinder

    http://www.cnblogs.com/wuhuacong/p/3780356.html Web开发上有很多HTML的编辑控件,如CKEditor.kindeditor等等,很多都做的很好,本文 ...