原型模式

来源:互联网 发布:python 热力地图 编辑:程序博客网 时间:2024/06/07 10:55

原型模式

原型模式结构图:
这里写图片描述

原型模式结构图代码解析:

/** * Created by 杨Sir on 2017/11/17. * 原型模式接口,,如果单纯是行为,使用接口最好 * 如果涉及到共性的属性,则使用抽象类最好。  需要自己权衡。 */public interface Prototype extends Cloneable {    public Prototype clone() throws CloneNotSupportedException;} 
/** * Created by 杨Sir on 2017/11/17. */public class ConcretePrototype implements Prototype{    private String name;    public ConcretePrototype() {    }    public ConcretePrototype(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public Prototype clone() throws CloneNotSupportedException {        return (Prototype) super.clone();    }    @Override    public String toString() {        return "ConcretePrototype{" +                "name='" + name + '\'' +                '}';    }}
/** * Created by 杨Sir on 2017/11/17. */public class Main {    public static void main(String[] args) throws CloneNotSupportedException {        Prototype prototype = new ConcretePrototype("张三");        /**         * 注意对象如果向上转型为接口类型,就只能调用接口定义的方法,子类的所有自定义方法不能调用         * 但是可以在使用该子类时将子类向下转型。         */        Prototype prototypeClone =  prototype.clone();        //为了修改子类的一些属性值,调用实现类的方法,需要向下转型。        ConcretePrototype prototypeClone1 = null;        if(prototype instanceof ConcretePrototype){            prototypeClone1 = (ConcretePrototype) prototype;        }        prototypeClone1.setName("lisi");        System.out.println(prototype);        System.out.println(prototypeClone);    }}

原型模式主要用于对象的复制,其核心就是Proptotype类。在Java中Prototype需要具备两个条件:
      ①. 实现 Cloneable接口。它的作用就是在运行时告知虚拟机可以安全的实现 此接口实现类上的clone().
       ②. 重写Object类的 clone()方法,该方法返回一个对象的拷贝。注意重写时将方法的访问修饰符改为 public

在实际开发过程中,原型模式一般会和其他模式混用。

原型模式的优点:
      一般在初始化的信息不发生变化的情况下,克隆是最好的创建对象的办法。这隐藏了对象创建的细节,对性能也大有很大提高,比如大对象的创建,循环创建相同类型对象等。

原型模式要注意的地方:
      原型模式复制对象不会调用类的构造方法,因为不会调用构造方法,所以不管你构造方法访问权限是什么,都无所谓。因此这就与单例模式产生了冲突,使用时需要注意。

深复制与潜复制
      如果被复制对象的字段是值类型的(这里包括8中基本数据类型、他们的包装类型、String),则对该字段执行逐位复制,如果是引用类型,只复制对象的引用而不复制对象本身。因此原始对象与其复本引用同一对象。
      深复制把引用对象的变量指向复制过的对象,而不是指向原来被引用的对象。

具体的深复制和浅复制我在另一篇博客《Java深复制与浅复制》中有详细解释。

原创粉丝点击