定義:在有些時(shí)候模叙,存在大量相同或者相似的對(duì)象創(chuàng)建場(chǎng)景。如果用傳統(tǒng)的構(gòu)造函數(shù)來創(chuàng)建對(duì)象,會(huì)比較復(fù)雜且耗時(shí)耗資源缝龄。這時(shí)可以用一個(gè)已經(jīng)創(chuàng)建的實(shí)例作為原型,通過復(fù)制該原型對(duì)象來創(chuàng)建一個(gè)和原型相同或相似的新對(duì)象挂谍。此時(shí)二拐,原型實(shí)例指定了要?jiǎng)?chuàng)建的對(duì)象的種類。而無需知道對(duì)象創(chuàng)建的細(xì)節(jié)凳兵。
優(yōu)點(diǎn):
1. Java自帶的原型模式基于內(nèi)存二進(jìn)制流的復(fù)制百新,比直接new一個(gè)對(duì)象性能要好的多。
2. 可以使用深克隆方式保存對(duì)象的狀態(tài)庐扫,使用原型模式將對(duì)象復(fù)制一份饭望,并將其狀態(tài)保存起來,簡化了創(chuàng)建對(duì)象的流程形庭,以便在需要的時(shí)候使用(恢復(fù)到歷史的某一狀態(tài))铅辞,可以輔助實(shí)現(xiàn)撤銷操作。
缺點(diǎn):
1. 需要為每一個(gè)類都配置一個(gè)clone方法
2. Clone方法位于類的內(nèi)部萨醒,當(dāng)對(duì)已有類進(jìn)行改造的時(shí)候斟珊,需要修改代碼,違背了開閉原則
3. 當(dāng)對(duì)象之間存在多重嵌套使用的時(shí)候富纸,為了實(shí)現(xiàn)深克隆囤踩,每一層對(duì)象對(duì)應(yīng)的類都必須支持深克隆,所以深克隆淺克隆要運(yùn)用得當(dāng)
模式結(jié)構(gòu):
1. 抽象原型類:規(guī)定了具體原型對(duì)象必須實(shí)現(xiàn)的接口
2. 具體原型類:實(shí)現(xiàn)抽象原型類的clone方法晓褪,它是可復(fù)制的對(duì)象
3. 訪問類:使用具體原型類中的clone方法來復(fù)制新的對(duì)象
應(yīng)用場(chǎng)景:
1. 對(duì)象之間相同或相似堵漱,即只是個(gè)別的幾個(gè)屬性不同的時(shí)候
2. 創(chuàng)建對(duì)象的成本較大,例如初始化時(shí)間長涣仿,占用資源多
3. 創(chuàng)建一個(gè)對(duì)象需要繁瑣的數(shù)據(jù)準(zhǔn)備或權(quán)限訪問等勤庐,需要提高性能或安全性
4. 系統(tǒng)中大量使用該類對(duì)象示惊,且各個(gè)調(diào)用者都需要給它的屬性重新賦值
實(shí)現(xiàn):
/**
* @Author: KenChen
* @Description: 原型模式示例
* Java 中的 Object 類提供了淺克隆的 clone() 方法,具體原型類只要實(shí)現(xiàn) Cloneable 接口就可實(shí)現(xiàn)對(duì)象的淺克隆
* 這里的 Cloneable 接口就是抽象原型類愉镰。
* @Date: Create in 2022/5/11 16:08
*/
//原型模式的測(cè)試類
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
Realizetype obj1 = new Realizetype();
Realizetype obj2 = (Realizetype) obj1.clone();
System.out.println(obj1==obj2);
}
}
//具體原型類
class Realizetype implements Cloneable{
public Realizetype(){
System.out.println("具體原型創(chuàng)建成功");
}
@Override
public Object clone() throws CloneNotSupportedException{
System.out.println("具體原型復(fù)制成功");
return (Realizetype)super.clone();
}
}