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. 如何删除github wiki page

    title: 如何删除github wiki page toc: false date: 2019-02-23 10:08:41 categories: methods tags: github wi ...

  2. iOS 应用开发入门指南

    前言:http://www.guomii.com/posts/20250安装工具:http://www.guomii.com/posts/20255工具:http://www.guomii.com/p ...

  3. ridis 集群配置

    ./redis-cli -h 192.168.106.128 -p  6379 redis 1.ping 2.set str1 abc    get str1 3.  mkdir ../redis-c ...

  4. 图像的全局特征--LBP特征

    原文链接:http://blog.csdn.net/zouxy09/article/details/7929531#comments 这个特征或许对三维图像特征提取有很大作用.文章有修改,如有疑问,请 ...

  5. 实践:使用FLANN.LSH进行检索

    1.Survey: FLANN 库详情见:http://en.wikipedia.org/wiki/Flann http://medievalscotland.org/kmo/AnnalsIndex/ ...

  6. 关于XML学习

    XML为知识构架存储语言: http://www.w3school.com.cn/xml/xml_tree.asp 语义网:为计算机构建一个系统的概念网络模型是计算机理解概念和机间信息交流的途径:XM ...

  7. iphone通讯录的备份与恢复

    最近在做iOS系统通讯录备份到服务器,并且可以从服务器中下载备份文件恢复到手机的功能,部分实现细节记录如下. 将iphone系统通讯录生成.vcf文件 ABAddressBookRef address ...

  8. css 添加阴影

    添加阴影,分为内阴影和外阴影. inset:内阴影. 不写默认外阴影. box-shadow: 水平位移  垂直位移  模糊半径 #box-shadow{ -moz-box-shadow:5px 5p ...

  9. 初步使用vue中axios

    1.下载axios npm install axios --save 2.两种方式使用axios (1)在模块中引入axios 例如:我在用户登陆界面需要使用axios,就在login页面引入,不是全 ...

  10. Windows自调试Redis

    一.安装Redis 1. Redis官网下载地址:http://redis.io/download,下载相应版本的Redis,在运行中输入cmd,然后把目录指向解压的Redis目录. 2.启动服务命令 ...