1.定義
用一個已經(jīng)創(chuàng)建的實例作為原型崖媚,通過復制該原型對象來創(chuàng)建一個和原型相同或相似的新對象。在這里脯燃,原型實例指定了要創(chuàng)建的對象的種類淳附。用這種方式創(chuàng)建對象非常高效议慰,根本無須知道對象創(chuàng)建的細節(jié)
例如,Windows 操作系統(tǒng)的安裝通常較耗時奴曙,如果復制就快了很多别凹。在生活中復制的例子非常多,這里不一一列舉了
2.優(yōu)缺點
原型模式的優(yōu)點:
-
Java
自帶的原型模式基于內存二進制流的復制洽糟,在性能上比直接·new
一個對象更加優(yōu)良炉菲。 - 可以使用深克隆方式保存對象的狀態(tài),使用原型模式將對象復制一份坤溃,并將其狀態(tài)保存起來拍霜,簡化了創(chuàng)建對象的過程,以便在需要的時候使用(例如恢復到歷史某一狀態(tài))薪介,可輔助實現(xiàn)撤銷操作祠饺。
原型模式的缺點:
- 需要為每一個類都配置一個
clone
方法 -
clone
方法位于類的內部,當對已有類進行改造的時候汁政,需要修改代碼道偷,違背了開閉原則缀旁。 - 當實現(xiàn)深克隆時,需要編寫較為復雜的代碼勺鸦,而且當對象之間存在多重嵌套引用時并巍,為了實現(xiàn)深克隆,每一層對象對應的類都必須支持深克隆换途,實現(xiàn)起來會比較麻煩履澳。因此,深克隆怀跛、淺克隆需要運用得當。
3.結構
原型模式包含以下主要角色:
- 抽象原型類:規(guī)定了具體原型對象必須實現(xiàn)的接口柄冲。
-
具體原型類:實現(xiàn)抽象原型類的
clone
() 方法吻谋,它是可被復制的對象。 -
訪問類:使用具體原型類中的
clone
() 方法來復制新的對象现横。
4.示例代碼
原型模式的克隆分為淺克隆和深克隆漓拾。
- 淺克隆:創(chuàng)建一個新對象,新對象的屬性和原來對象完全相同戒祠,對于非基本類型屬性骇两,仍指向原有屬性所指向的對象的內存地址。
- 深克隆:創(chuàng)建一個新對象姜盈,屬性中引用的其他對象也會被克隆低千,不再指向原有對象地址。
Java 中的 Object 類提供了淺克隆的 clone() 方法馏颂,具體原型類只要實現(xiàn) Cloneable 接口就可實現(xiàn)對象的淺克隆示血,這里的 Cloneable 接口就是抽象原型類。其代碼如下:
//具體原型類
class Realizetype implements Cloneable {
Realizetype() {
System.out.println("具體原型創(chuàng)建成功救拉!");
}
public Object clone() throws CloneNotSupportedException {
System.out.println("具體原型復制成功难审!");
return (Realizetype) super.clone();
}
}
//原型模式的測試類
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?" + (obj1 == obj2));
}
}
執(zhí)行結果如下:
具體原型創(chuàng)建成功!
具體原型復制成功亿絮!
obj1==obj2?false