Skip to content

设计模式:创建型—原型模式

Published: at 16:22:56

原型模式的定义

如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。

这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。

理解对象的创建成本

实际上,创建对象包含的申请内存、给成员变量赋值这一过程,本身并不会花费太多时间,或者说对于大部分业务系统来说,这点时间完全是可以忽略的。

但是,如果对象中的数据需要经过复杂的计算才能得到(比如排序、计算哈希值),或者需要从 RPC、网络、数据库、文件系统等非常慢速的 IO 中读取,这种情况下,我们就可以利用原型模式,从其他已有对象中直接拷贝得到,而不用每次在创建新对象的时候,都重复执行这些耗时的操作。

原型模式的实现方式:深拷贝和浅拷贝

在 Java 语言中,Object 类的 clone() 方法执行的就是我们常说的浅拷贝。它只会拷贝对象中的基本数据类型的数据(比如,int、long),以及引用对象(SearchWord)的内存地址,不会递归地拷贝引用对象本身。

那如何实现深拷贝呢?

第一种方法:递归拷贝对象、对象的引用对象以及引用对象的引用对象……直到要拷贝的对象只包含基本数据类型数据,没有引用对象为止。

第二种方法:先将对象序列化,然后再反序列化成新的对象。

原型模式Java 实现

下面Java实现代码转自维基百科

/** Prototype Class **/
public class Cookie implements Cloneable {

    public Object clone() throws CloneNotSupportedException
    {
        //In an actual implementation of this pattern you would now attach references to
        //the expensive to produce parts from the copies that are held inside the prototype.
        return (Cookie) super.clone();
    }
 }

 /** Concrete Prototypes to clone **/
 public class CoconutCookie extends Cookie { }

 /** Client Class**/
 public class CookieMachine
 {

   private Cookie cookie;//cookie必须是可复制的

     public CookieMachine(Cookie cookie) {
         this.cookie = cookie;
     }

    public Cookie makeCookie()
    {
        try
        {
            return (Cookie) cookie.clone();
        } catch (CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return null;
    }


     public static void main(String args[]){
         Cookie tempCookie =  null;
         Cookie prot = new CoconutCookie();
         CookieMachine cm = new CookieMachine(prot); //设置原型
         for(int i=0; i<100; i++)
             tempCookie = cm.makeCookie();//通过复制原型返回多个cookie
     }
 }

原型模式的优缺点

优点

缺点