对象的影分身之术(原型模式)

原型模式

在《火影忍者》中,影分身之术,是使用查克拉制造出有实体的分身,它们可以和施术者一样行动战斗,具有独立于施术者本体的意识。在软件开发中也有和影分身相似的思想就是原型模式。

原型模式的核心思想是以一个已经创建的对象为原型,通过对其进行复制的方式来创建一个相似或者相同的对象。很好理解和我们常用的ctrl + cctrl + v差不多。下面关于原型模式的类图

原型模式

在Java中已经为我们提供了Prototype接口,为Cloneable接口。只需要实现Cloneable接口,覆盖clone方法。其中Cloneable是空接口,用来标记此类要进行复制操作,主要还是通过super.clone()来调用Objectclone()方法进行复制。下面是Java对原型模式的实现:

// java 原型模式的实现,浅拷贝
public class ConcretePrototype implements Cloneable {
    public ConcretePrototype(){
        System.out.printf("原型类创建成功\n");
    }
    // 重写 clone 方法
    public Object clone() throws CloneNotSupportedException{
        System.out.printf("原型复制成功\n");
        // Java 中的 Object 类提供了复制的 clone() 方法
        return (ConcretePrototype)super.clone();
    }
}

上面代码实现的复制被称为是浅复制,它只会复制变量里面的值,对于基本数据类型的变量复制里面的值,没有什么可以质疑,和重新创建一个变量差不多,而对于引用类型的变量来说里面的值是引用对象的地址,进行复制,相对于多了一个变量来指向引用对象,原对象和副本指向同一个对象。深复制要比浅复制彻底,不管是基本数据类型还有引用类型,都是重新创建的,缺点就是自己手动实现,每个引用对象的复制,都需要调用引用对象的clone方法。还要被保证引用的对象实现了Cloneable接口,不然抛出异常。下面原型模式深复制的例子:

// java 原型模式的实现, 深拷贝
public class Employee implements Cloneable {

    private double salary;
    private Date hireDay;
    
    public Employee(double salary){
        this.salary = salary;
        this.hireDay = new Date();
    }
    
    public Object clone() throws CloneNotSupportedException{
        Employee emp = (Employee)super.clone();
        // 手动对 Date 对象 进行复制
        // Date 已经实现了 Cloneable 接口
        emp.hireDay = (Date)this.hireDay.clone();
        // 返回 深复制 之后的对象
        return emp;
    }
}

总结

原型模式是通过复制拷贝的方式创建对象,这样可以动态地获得对象运行时的状态,同时又隐藏了创建对象的细节,对性能有很大的提升。在实现时还要根据自己的需求选择对应的复制拷贝方式,浅复制实现起来简单,但复制不彻底。深复制复制彻底,但实现起来复杂。

公众号:HarLearn

公众号:HarLearn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值