歡迎關注微信公衆號:FSA全棧行動 👋java
原型模型(Prototype) 是一種對象建立型模式,使用原型實例指定建立對象的種類,並經過拷貝這些原型建立新的對象,主要用於建立重複的對象,同時又能保證性能。工做原理是將一個原型對象傳給那個要發動建立的對象,這個要發動建立的對象經過原型對象拷貝本身來實現建立過程。原型模型應該是最簡單的設計模式了,實現一個接口,重寫一個方法便可完成原型模式。設計模式
綜上,爲方便記憶原型模式,能夠 「膚淺」 的認爲:微信
如下,是對 Cloneable 接口的補充說明:markdown
建立原型類(ConretePrototype) :app
public class Person implements Cloneable, Serializable {
private String name;
private int age;
private List<String> list;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
@Override
protected Person clone() throws CloneNotSupportedException {
return (Person) super.clone();
}
public Person deepClone() {
Person copyObj = null;
byte[] byteArray = null;
// 序列化 輸出
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);) {
oos.writeObject(this);
byteArray = baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
// 反序列化 輸入
try (ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
ObjectInputStream ois = new ObjectInputStream(bais);) {
copyObj = (Person) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return copyObj;
}
}
複製代碼
注意:deepClone()中 try-catch 的用法是 JDK1.7 優化後的
try-with-resource
語法,會自動調用 close()。ide
使用方使用原型類克隆出新對象實例:函數
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
List<String> fruits = new ArrayList<String>(Arrays.asList("apple", "banana", "pear"));
Person person1 = new Person();
person1.setName("GitLqr");
person1.setAge(18);
person1.setList(fruits);
// 淺拷貝
// Person person2 = person1.clone();
// 深拷貝
Person person2 = person1.deepClone();
person2.setName("CharyLin");
person2.getList().add("shit");
System.out.println("person1 name is " + person1.getName() + ", age is " + person1.getAge() + ", list is "
+ person1.getList());
System.out.println("person2 name is " + person2.getName() + ", age is " + person2.getAge() + ", list is "
+ person2.getList());
}
}
複製代碼
若是文章對您有所幫助, 請不吝點擊關注一下個人微信公衆號:FSA全棧行動, 這將是對我最大的激勵. 公衆號不只有Android技術, 還有iOS, Python等文章, 可能有你想要了解的技能知識點哦~oop