1、什么是原型模式
Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.
Prototype Design Pattern:用原型實(shí)例指定創(chuàng)建對(duì)象的種類, 并且通過拷貝這些原型創(chuàng)建新的對(duì)象。
說人話:對(duì)象復(fù)制
2、原型模式的兩種實(shí)現(xiàn)方法
我們?nèi)粘i_發(fā)中,應(yīng)該有使用過 BeanUtils.copyProperties()方法,其實(shí)這就是原型模式的一種用法(淺拷貝)。原型模式實(shí)現(xiàn)分兩種:
①、淺拷貝:只會(huì)復(fù)制對(duì)象中基本數(shù)據(jù)類型數(shù)據(jù)和引用對(duì)象的內(nèi)存地址,不會(huì)遞歸地復(fù)制引用對(duì)象,以及引用對(duì)象的引用對(duì)象
②、深拷貝:得到的是一份完完全全獨(dú)立的對(duì)象。
Java 中 Object 類是所有類的根類,Object 類提供了一個(gè) clone()方法,該方法可以將一個(gè) Java 對(duì)象復(fù)制一份,但是在調(diào)用 clone方法的Java類必須要實(shí)現(xiàn)一個(gè)接口Cloneable,這是一個(gè)標(biāo)志接口,標(biāo)志該類能夠復(fù)制且具有復(fù)制的能力,如果不實(shí)現(xiàn) Cloneable 接口,直接調(diào)用clone方法,會(huì)拋出 CloneNotSupportedException 異常。
/**
* A class implements theCloneable
interface to
* indicate to the {@link java.lang.Object#clone()} method that it
* is legal for that method to make a
* field-for-field copy of instances of that class.
*
* Invoking Objects clone method on an instance that does not implement the
*Cloneable
interface results in the exception
*CloneNotSupportedException
being thrown.
*
* By convention, classes that implement this interface should override
* Object.clone (which is protected) with a public method.
* See {@link java.lang.Object#clone()} for details on overriding this
* method.
*
* Note that this interface does not contain the clone method.
* Therefore, it is not possible to clone an object merely by virtue of the
* fact that it implements this interface. Even if the clone method is invoked
* reflectively, there is no guarantee that it will succeed.
*
* @author unascribed
* @see java.lang.CloneNotSupportedException
* @see java.lang.Object#clone()
* @since JDK1.0
*/
public interface Cloneable {
}
關(guān)于深淺拷貝的詳細(xì)說明,可以參考我的這篇博客:
3、原型模式的優(yōu)點(diǎn)
①、性能高
原型模式是在內(nèi)存二進(jìn)制流的拷貝, 要比直接new一個(gè)對(duì)象性能好很多, 特別是要在一個(gè)循環(huán)體內(nèi)產(chǎn)生大量的對(duì)象時(shí), 原型模式可以更好地體現(xiàn)其優(yōu)點(diǎn)。
②、避免構(gòu)造函數(shù)的約束
這既是它的優(yōu)點(diǎn)也是缺點(diǎn),直接在內(nèi)存中拷貝,構(gòu)造函數(shù)是不會(huì)執(zhí)行的 。 優(yōu)點(diǎn)就是減少了約束, 缺點(diǎn)也是減少了約束, 需要大家在實(shí)際應(yīng)用時(shí)考慮。
4、原型模式使用場景
①、在需要一個(gè)類的大量對(duì)象的時(shí)候,使用原型模式是最佳選擇,因?yàn)樵湍J绞窃趦?nèi)存中對(duì)這個(gè)對(duì)象進(jìn)行拷貝,要比直接new這個(gè)對(duì)象性能要好很多,在這種情況下,需要的對(duì)象越多,原型模式體現(xiàn)出的優(yōu)點(diǎn)越明顯。
②、如果一個(gè)對(duì)象的初始化需要很多其他對(duì)象的數(shù)據(jù)準(zhǔn)備或其他資源的繁瑣計(jì)算,那么可以使用原型模式。
③、當(dāng)需要一個(gè)對(duì)象的大量公共信息,少量字段進(jìn)行個(gè)性化設(shè)置的時(shí)候,也可以使用原型模式拷貝出現(xiàn)有對(duì)象的副本進(jìn)行加工處理。