设计模式学习笔记——原型模式

原文:http://blog.youkuaiyun.com/hackerain/article/details/7545857

定义:

用原型实例创建对象的种类,通过拷贝这些原型创建新的对象

在java中,其实原型模型已经应用到了平常的操作中,即只要类实现了Cloneable接口,那么这个类的对象,就可以通过其父类的clone()方法被复制,这就是原型模型。

但是要注意以下几点:

1、通过复制的方式产生了一个对象,构造方法是不会执行的,因为Object类的clone()方法的原理是从内存中以二进制流的方式进行拷贝,重新分配一个内存块。

2、深拷贝和浅拷贝的问题,Object类提供的clone()方法只拷贝对象本身,而对其对象内部的数组、引用对象都不拷贝,复制出来的对象中的引用类型的成员变量,还是指向原生对象的内部的引用类型对象的地址,这叫做浅拷贝。这是一种不安全的方式,若要避免这样的方式,就要使用深拷贝,即在复制对象的时候,再把该对象中的引用类型的成员变量复制一次,就实现了深拷贝。

3、既然要使用对象复制的功能,那么就不应该使用final关键字,clone和final是冲突的。


下面是源代码:

[java]  view plain copy
  1. /** 
  2.  * Object类提供的clone()方法只拷贝对象本身,而对其对象内部的数组、引用对象都不拷贝,复制出来的对象中的引用类型 
  3.  * 的成员变量,还是指向原生对象的内部的引用类型对象的地址,这叫做浅拷贝。这是一种不安全的方式,若要避免这样的方 
  4.  * 式,就要使用深拷贝,即在复制对象的时候,再把该对象中的引用类型的成员变量复制一次,就实现了深拷贝。 
  5.  */  
  6. public class Prototype implements Cloneable {  
  7.       
  8.     //这里有一个引用类型的成员变量,所以在clone()中,要实现对对象的深拷贝  
  9.     private ArrayList<String> arrayList=new ArrayList<String>();  
  10.       
  11.     /* 
  12.      * 构造函数,注意:在调用clone()方法进行对象复制的时候,是不会执行构造函数的,因为 
  13.      * Object类的clone()方法的原理是从内存中以二进制流的方式进行拷贝,重新分配一个内存块。 
  14.      */  
  15.     public Prototype(){  
  16.         System.out.println("Construct is invoked...");  
  17.     }  
  18.       
  19.     //重写父类中的clone方法,实现对象的复制  
  20.     @SuppressWarnings("unchecked")  
  21.     @Override  
  22.     public Prototype clone() throws CloneNotSupportedException {  
  23.         Prototype prototype=null;  
  24.         prototype=(Prototype)super.clone();  
  25.         prototype.arrayList=(ArrayList<String>)this.arrayList.clone();//深拷贝  
  26.         return prototype;  
  27.     }  
  28.       
  29.     //setter/getter方法  
  30.     public void setValue(String value){  
  31.         this.arrayList.add(value);  
  32.     }  
  33.       
  34.     public ArrayList<String> getValues(){  
  35.         return this.arrayList;  
  36.     }  
  37. }  
[java]  view plain copy
  1. public class Client {  
  2.     public static void main(String[] args) throws CloneNotSupportedException {  
  3.           
  4.         Prototype p1=new Prototype();  
  5.         p1.setValue("piao");  
  6.         System.out.println(p1.getValues());  
  7.           
  8.         //因为在p1中对引用对象已经进行了赋值,所以p2拷贝的是p1赋值之后的对象,  
  9.         //也就相应的把赋到引用对象中的值一起拷贝过来了,所以在p2是对当前状态  
  10.         //的p1对象进行的拷贝。  
  11.         Prototype p2=p1.clone();  
  12.         p2.setValue("suo");  
  13.         p2.setValue("datou");  
  14.         System.out.println(p2.getValues());  
  15.     }  
  16. }  

原型模型的优点:

1、因为原型模型使用的是内存二进制流的拷贝,所以要比直接new一个对象效率高很多。

2、逃避构造函数的约束,这个即是优点,又是缺点。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值