原型模式

原型模式

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

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

/**
 * 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深复制与浅复制》中有详细解释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值