设计模式-原型模式(克隆)

参考:http://blog.csdn.net/zhengzhb/article/details/7393528
http://blog.csdn.net/treeroot/article/details/96936
http://www.cnblogs.com/yqin/archive/2010/08/31/1813961.html
 
 
原型模式(Prototype Pattern):原型模式是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模式允许一个对象再创建另外一个可定制的对象,无须知道任何创建的细节。
动机:
在面向对象系统中,使用原型模式来复制一个对象自身,从而克隆出多个与原型对象一模一样的对象。
在软件系统中,有些对象的创建过程较为复杂,而且有时候需要频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的意图所在。

原型模式的基本工作原理是通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝原型自己来实现创建过程。

 

如 Object 中的obj.clone 方法

 

克隆分为浅克隆和深克隆

浅克隆不复制成员,深克隆复制成员

PS:深拷贝与浅拷贝问题中,会发生深拷贝的有java中的8中基本类型以及他们的封装类型,另外还有String类型。其余的都是浅拷贝。

java中的应用:

class Student implements Cloneable
{
    String name;
    int age;
    Student(String name,int age)
    {
       this.name=name;
       this.age=age;
    }
    public Object clone()
    {
       Object o=null;
       try
       {
         o=(Student)super.clone();//Object中的clone()识别出你要复制的是哪一个对象。
        }
       catch(CloneNotSupportedException e)
       {
         System.out.println(e.toString());
       }
       return o;
     }


    public static void main(String[] args)
    {
       Student s1=new Student("zhangsan",18);
       Student s2=(Student)s1.clone();
       s2.name="lisi";
       s2.age=20;
       System.out.println("name="+s1.name+","+"age="+s1.age);//修改学生2后,不影响学生1的值。                                                                                                     
     }
}

必须要继承Cloneable接口

clone方法是在Object种定义的,而且是protected型的,只有实现了这个接口,才

可以在该类的实例上调用clone方法,否则会抛出CloneNotSupportException.
Object中默认的实现是一个浅拷贝

 

 

 

 

应用:

(1) 原型模式应用于很多软件中,如果每次创建一个对象要花大量时间,原型模式是最好的解决方案。很多软件提供的复制(Ctrl + C)和粘贴(Ctrl + V)操作就是原型模式的应用,复制得到的对象与原型对象是两个类型相同但内存地址不同的对象,通过原型模式可以大大提高对象的创建效率。
(2) 在Struts2中为了保证线程的安全性,Action对象的创建使用了原型模式,访问一个已经存在的Action对象时将通过克隆的方式创建出一个新的对象,从而保证其中定义的变量无须进行加锁实现同步,每一个Action中都有自己的成员变量,避免Struts1因使用单例模式而导致的并发和同步问题。
(3) 在Spring中,用户也可以采用原型模式来创建新的bean实例,从而实现每次获取的是通过克隆生成的新实例,对其进行修改时对原有实例对象不造成任何影响。

posted on 2014-03-18 17:49  wjw334  阅读(330)  评论(0编辑  收藏  举报

导航