原型模式的java实现例子

原创  2016年09月30日 17:51:13

说明:本文是《大话设计模式》一书的学习文摘和网上相关信息文摘,原书代码例子用C#写,下面用Java改写。


1、原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。


2、原型模式的UML类图


3、在Java中原型模式变成clone()方法的使用,由于Java的纯洁的面向对象特性,使得在Java中使用设计模式变得很自然,两者已经几乎是浑然一体了。
Java中对象的克隆: 
(1)为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。 
(2)在派生类中覆盖基类的clone()方法,并声明为public。 
(3)在派生类的clone()方法中,调用super.clone()。 
(4)在派生类中实现Cloneable接口。

4、在Java中,clone()方法是浅复制。
浅复制(浅克隆) :被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

深复制(深克隆) :被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
可以利用串行化来做深复制,所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象。

5、下面实现一个简历的原型模式

[java]  view plain  copy
  1. package demo9;  
  2.   
  3. import java.io.*;  
  4.   
  5. /** 
  6.  * 简历类  
  7.  * 
  8.  */  
  9. public class Resume implements Serializable,Cloneable {  
  10.     /** 
  11.      *  
  12.      */  
  13.     private static final long serialVersionUID = 8614140644886700330L;  
  14.     private String name;  
  15.     private String sex;  
  16.     private Integer age;  
  17.     private WorkExperience work;  
  18.       
  19.     public Resume(String name){  
  20.         this.name = name;  
  21.         work = new WorkExperience();  
  22.     }  
  23.     //设置个人信息  
  24.     public void setPersonalInfo(String sex, Integer age){  
  25.         this.sex = sex;  
  26.         this.age = age;  
  27.     }  
  28.     //设置工作经历  
  29.     public void setWorkExperience(String workDate,String company){  
  30.         work.setWorkDate(workDate);  
  31.         work.setCompany(company);  
  32.     }  
  33.     //显示  
  34.     public void display(){  
  35.         System.out.println(String.format("%s %s %s", name,sex,age));  
  36.         System.out.println(String.format("工作经历:%s %s", work.getWorkDate(), work.getCompany()));  
  37.     }  
  38.     //浅复制  
  39.     public Object clone(){  
  40.         Object obj = null;  
  41.         try {  
  42.             obj = super.clone();  
  43.         } catch (CloneNotSupportedException e) {              
  44.             e.printStackTrace();  
  45.         }  
  46.         return obj;  
  47.     }  
  48.     //深复制  
  49.     public Object deepClone() throws IOException, ClassNotFoundException{  
  50.         //将对象写到流里  
  51.         ByteArrayOutputStream bo = new ByteArrayOutputStream();  
  52.         ObjectOutputStream oo = new ObjectOutputStream(bo);  
  53.         oo.writeObject(this);  
  54.         //从流里读出来  
  55.         ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());  
  56.         ObjectInputStream oi = new ObjectInputStream(bi);  
  57.         return (oi.readObject());  
  58.     }  
  59.       
  60. }  
  61.   
  62.   
  63. package demo9;  
  64.   
  65. import java.io.Serializable;  
  66.   
  67. /** 
  68.  * 工作经历类 
  69.  * 
  70.  */  
  71. public class WorkExperience implements Serializable {         
  72.     private static final long serialVersionUID = -5461562344310808271L;  
  73.     private String workDate;  
  74.     public String getWorkDate() {  
  75.         return workDate;  
  76.     }  
  77.     public void setWorkDate(String workDate) {  
  78.         this.workDate = workDate;  
  79.     }  
  80.       
  81.     private String company;  
  82.     public String getCompany() {  
  83.         return company;  
  84.     }  
  85.     public void setCompany(String company) {  
  86.         this.company = company;  
  87.     }  
  88. }  
  89.   
  90.   
  91. package demo9;  
  92.   
  93. import java.io.IOException;  
  94.   
  95. /** 
  96.  * 客户端调用 
  97.  * 
  98.  */  
  99. public class Demo9 {      
  100.     public static void main(String[] args) throws ClassNotFoundException, IOException {        
  101.         Resume a = new Resume("大鸟");  
  102.         a.setPersonalInfo("男"29);  
  103.         a.setWorkExperience("1998-2000""xx公司");  
  104.         //浅复制  
  105.         Resume b = (Resume)a.clone();  
  106.         b.setWorkExperience("1998-2006""yy公司");  
  107.         b.setPersonalInfo("男"25);  
  108.           
  109.         a.display();  
  110.         b.display();  
  111. //      运行结果:a和b的WorkExperience的引用值是一样的  
  112. //      大鸟 男 29  
  113. //      工作经历:1998-2006 yy公司  
  114. //      大鸟 男 25  
  115. //      工作经历:1998-2006 yy公司  
  116.          
  117.         Resume c = new Resume("大鸟");  
  118.         c.setPersonalInfo("男"29);  
  119.         c.setWorkExperience("1998-2000""xx公司");  
  120.         //深复制  
  121.         Resume d = (Resume)c.deepClone();  
  122.         d.setWorkExperience("1998-2006""yy公司");  
  123.         d.setPersonalInfo("男"25);  
  124.                       
  125.         c.display();  
  126.         d.display();  
  127. //      运行结果:a和b的WorkExperience的引用值是不同的  
  128. //      大鸟 男 29  
  129. //      工作经历:1998-2000 xx公司  
  130. //      大鸟 男 25  
  131. //      工作经历:1998-2006 yy公司  
  132.           
  133.     }  
  134. }  


 
mikecong
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值