原型模式的定义与特点

  用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。

 

原型模式的结构与实现

  由于 Java 提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单。

  1. 模式的结构

  原型模式包含以下主要角色。

    抽象原型类:规定了具体原型对象必须实现的接口。

    具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。

    访问类:使用具体原型类中的 clone() 方法来复制新的对象。

  UML图

原型模式的结构图

 

原型模式的两大实现形式,浅克隆和深克隆。对应object.clone()方法中的深浅克隆

  浅克隆:只克隆八大基本类型和不变的类型(例如String)。对于引用类型,则只复制其内存地址。也就是说,浅克隆对引用类型而言并没有做到两个对象间的完全解耦。两个对象里面的引用类型实际上引用的是相同的对象。

/**
     * 浅克隆,只克隆基本常量。对于引用而言。引用的还是同一个对象。并没有完全解耦。
     */
    public  Project clone (){
        Project pro = null;
       try{
           pro = (Project) super.clone();
       }catch (Exception e){
           e.printStackTrace();
       }
       return pro;
    }

  深克隆:引用类型也做了克隆,也就是说引用的是不同的对象。内存地址不同。做法,通过序列化,将引用对象写入流中,并写出到新的内存地址中。自己还没写代码实例hhhhh。

 

总结:

  使用情景:创建对象成本比较大,比如初始化要很长时间的,占用太多CPU的,新对象可以通过复制已有的对象获得的,如果是相似的对象,则可以对其成员变量稍作修改。且很明显看出原型也是一种对象创建模式。