概述:
使用原型實例指定要創建對象的類型,通過複製這個原型來創建新對象
不需要知道任何創建的細節,不調用構造函數
適用場景:
類初始化消耗較多資源
new產生的一個對象需要非常繁瑣的過程(數據準備、訪問權 限等 構造函數比較複雜
循環體中生產大量對象時
優點:
原型模式性能比直接new-個對象性能高
簡化創建過程
缺點:
必須配備克隆方法
對克隆複雜對象或對克隆出的對象進行復雜改造時,容易引入風險
深拷貝、淺拷貝要運用得當
public abstract class Prototype {
abstract Prototype myClone();}
public class ConcretePrototype extends Prototype {
private String filed;
public ConcretePrototype(String filed) {
this.filed = filed;
}
@Override
Prototype myClone() {
return new ConcretePrototype(filed);
}
@Override
public String toString() {
return filed;
}}
public class Client {
public static void main(String[] args) {
Prototype prototype = new ConcretePrototype("abc");
Prototype clone = prototype.myClone();
System.out.println(clone.toString());
}}
abc
附:
抽象克隆方法:在一個抽象類中添加克隆接口,重寫克隆方法,繼承他的子類也能夠進行克隆
如果使用默認的克隆方法,它是淺克隆(即雖然克隆出來的對象地址不同,但是如果克隆的對象中有引用類型的成員變量,在克隆後的對象中的對應成員變量是指向同一個變量對象地址的,修改被克隆對象的值,克隆對象的值也會隨之改變)
如果要進行深克隆的話,應當在重寫的克隆方法中單獨克隆引用類型的成員變量。
JDK中
* java.lang.Object#clone()
實現這個模式的如:
ArrayList
HashMap<K,V>