本文主要是介绍对象的影分身之术(原型模式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原型模式
在《火影忍者》中,影分身之术,是使用查克拉制造出有实体的分身,它们可以和施术者一样行动战斗,具有独立于施术者本体的意识。在软件开发中也有和影分身相似的思想就是原型模式。
原型模式的核心思想是以一个已经创建的对象为原型,通过对其进行复制的方式来创建一个相似或者相同的对象。很好理解和我们常用的ctrl + c
和ctrl + v
差不多。下面关于原型模式的类图
在Java中已经为我们提供了Prototype
接口,为Cloneable
接口。只需要实现Cloneable
接口,覆盖clone
方法。其中Cloneable
是空接口,用来标记此类要进行复制操作,主要还是通过super.clone()
来调用Object
的clone()
方法进行复制。下面是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
这篇关于对象的影分身之术(原型模式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!