原型模式是一種創建型設計模式, 用于創建對象, 而不必指定它們所屬的具體類. 它通過復制現有對象 (即原型) 來創建新對象. 原型模式適用于當創建新對象的過程代價較高或復雜時, 通過克隆現有對象來提高性能
原型模式結構
- 原型接口. 聲明一個克隆自身的接口
- 具體原型. 實現克隆的具體方法
- 客戶端. 通過調用具體原型中的克隆方法來創建新對象
原型模式實現
// 原型接口
interface Prototype {Prototype clone();
}// 具體原型類
class ConcretePrototype implements Prototype {private String field;public ConcretePrototype(String field) {this.field = field;}// 實現克隆方法@Overridepublic Prototype clone() {return new ConcretePrototype(this.field);}@Overridepublic String toString() {return "ConcretePrototype{" + "field = " + field + '\'' + '}';}
}// 客戶端
public class Client {public static void main(String[] args) {// 創建原型對象ConcretePrototype prototype = new ConcretePrototype("prototype");// 克隆原型對象ConcretePrototype clone = (ConcretePrototype) prototype.clone();System.out.println(prototype);System.out.println(clone);}
}
在原型模式中, 克隆可以分為淺拷貝和深拷貝
- 淺拷貝: 復制對象時, 只復制對象本身的基本數據類型字段和對象的引用, 而不復制引用對象本身
- 深拷貝: 復制對象時, 不僅復制對象本身的基本數據類型字段和對象的引用, 還復制所有引用對象, 遞歸地進行復制
下面是深拷貝和淺拷貝的實例
淺拷貝:
import java.util.ArrayList;
import java.util.List;// 具體原型類
class ConcretePrototype implements Prototype {private List<String> list;public ConcretePrototype() {this.list = new ArrayList<>();}public void addItem(String item) {this.list.add(item);}@Overridepublic Prototype clone() {try {return (ConcretePrototype) super.clone(); // 淺拷貝} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}@Overridepublic String toString() {return "ConcretePrototype{" + "list=" + list + '}';}
}
深拷貝:
import java.util.ArrayList;
import java.util.List;// 具體原型類
class ConcretePrototype implements Prototype {private List<String> list;public ConcretePrototype() {this.list = new ArrayList<>();}public void addItem(String item) {this.list.add(item);}@Overridepublic Prototype clone() {ConcretePrototype clone = new ConcretePrototype();clone.list = new ArrayList<>(this.list); // 深拷貝return clone;}@Overridepublic String toString() {return "ConcretePrototype{" + "list=" + list + '}';}
}