## 原型設計模式
###
是一種對象創建型模式,使用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象,主要用于創建重復的對象,同時又能保證性能。
####
工作原理是將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝自己來實現創建過程。
###
應該是最簡單的設計模式了,實現一個接口,重寫一個方法即完成了原型模式。
###
## 應用場景
###
創建新對象成本較大,新的對象可以通過原型模式對已經有的對象進行復制來獲得。
如果系統要保存對象的狀態,做備份使用。
###
## 原型設計模式涉及到了深拷貝和淺拷貝
###
### 淺拷貝
###
如果原型對象的成員變量是基本數據類型(int、double、byte、boolean、char等),將復制?份給克隆對象;
如果原型對象的成員變量是引?類型,則將引?對象的地址復制?份給克隆對象,也就是說原型對象和克隆對象的成員變量指向相同的內存地址;
通過覆蓋Object類的clone()?法可以實現淺克隆。
###
### 深拷?
###
?論原型對象的成員變量是基本數據類型還是引?類型,都將復制?份給克隆對象,如果需要實現深克隆,可以通過序列化(Serializable)等?式來實現。
###
**原型模式是內存?進制流的拷?,?new對象性能?很多,使?的時候記得注意是選擇淺拷?還是深拷?**
###
## 原型設計模式的優點
###
當創建新的對象實例較為復雜時,使?原型模式可以簡化對象的創建過程,可以提?新實例的創建效率
###
可輔助實現撤銷操作,使?深克隆的?式保存對象的狀態,使?原型模式將對象復制?份并將其狀態保存起來,以便在需要的時候使?恢復到歷史狀態
###
## 具體實現(云效代碼study-java項目當中設計模式當中有代碼案例):
###
~~~
package com.goldnecis.設計模式.原型模式;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Persion implements Cloneable, Serializable {
private String name;
private int age;
private List<String> list = new ArrayList<>();
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Persion() {
System.out.println("構造函數調用");
}
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;
}
@Override
protected Persion clone() throws CloneNotSupportedException {
return (Persion) super.clone();
}
/**
* 對象深拷貝
* @return
*/
public Object deepClone() {
//首先,創建一個ByteArrayOutputStream對象baos,它是一個字節數組輸出流,用于將對象序列化為字節數組。
//然后,創建一個ObjectOutputStream對象oos,它是一個對象輸出流,用于將對象寫入baos中進行序列化操作。
//通過調用oos.writeObject(this),將當前對象this寫入baos,實現對象的序列化。
//接下來,創建一個ByteArrayInputStream對象bais,它是一個字節數組輸入流,用于從字節數組中讀取對象數據。
//然后,創建一個ObjectInputStream對象ois,它是一個對象輸入流,用于從bais中讀取對象并進行反序列化操作。
//通過調用ois.readObject(),從bais中讀取反序列化的對象數據,并將其轉換為Persion類型的對象copyObj。
//最后,返回copyObj作為方法的結果,表示深拷貝后得到的新對象。
//如果在序列化或反序列化過程中出現異常,將打印異常堆棧信息,并返回null。
try {
//輸出 序列化
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
//輸入 反序列化
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
Persion copyObj = (Persion) ois.readObject();
return copyObj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
~~~
再來看如何調用進行深淺拷貝
###
~~~
package com.goldnecis.設計模式.原型模式;
//原型模式的實現
//其實就是類的深拷貝和淺拷貝
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Persion person1 = new Persion();
person1.setAge(10);
person1.setName("小滴課堂-老王");
//首先被拷貝對象的list當中已經有了aaa 如果是淺拷貝 person1當中aaa如果persion2設置了ccc那么person1當中的list也會有ccc結果就是aaa,ccc persion2當中也是aaa,ccc
//如果是深拷貝,person1當中的list就是aaa 因為是深拷貝 所以persion2當中再去設置ccc和persion1就沒有任何的關系 所以persion2當中的list就是aaa,ccc persion1當中就是aaa
person1.getList().add("aaa");
//淺拷貝
//如果是淺拷貝并且如果原型對象的成員變量是基本數據類型(int double byte boolean char 等)將復制一份給克隆對象
//如果原型對象的成員變量是引用數據類型,則將引用對象的內存地址復制一份給克隆對象,也就是說原型對象和克隆對象的成員變量指向相同的內存地址
//通過覆蓋Object類的clone()方法可以實現淺拷貝
Persion persion2 = person1.clone();
//深拷貝
//無論原型對象的成員變量是基本數據類型還是引用數據類型,都將復制一份給克隆對象,如果需要實現深克隆,可以通過序列化Serializable等方式來實現
//原型模式是內存二進制流的拷貝,比new對象性能高很多,使用的時候記得注意是選擇淺拷貝還是深拷貝
//Persion persion2 = (Persion) person1.deepClone();
persion2.setName("Anna小姐姐");
persion2.getList().add("ccc");
System.out.println("person1="+person1.getName()+", age="+person1.getAge());
System.out.println("person2="+persion2.getName()+", age="+persion2.getAge());
//首先被拷貝對象的list當中已經有了aaa 如果是淺拷貝 person1當中aaa如果persion2設置了ccc那么person1當中的list也會有ccc結果就是aaa,ccc persion2當中也是aaa,ccc
//如果是深拷貝,person1當中的list就是aaa 因為是深拷貝 所以persion2當中再去設置ccc和persion1就沒有任何的關系 所以persion2當中的list就是aaa,ccc persion1當中就是aaa
System.out.println(person1.getList().toString());
System.out.println(persion2.getList().toString());
}
}
~~~
###

###

- 設計模式六大原則
- 常見的三大設計模式分類
- 創建型模式之單例模式
- 單例模式之懶漢
- 單例模式之餓漢
- 單例模式之如何選擇懶漢餓漢
- 什么情況下使用單例模式
- 創建型模式之工廠模式
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
- 創建型模式之原型模式
- 創建型模式之建造者模式
- 結構型模式之適配器模式
- 接口的適配器模式
- 類的適配器模式
- 結構型模式之橋接模式
- 結構型模式之橋接模式和適配器模式的區別
- 結構型模式之裝飾器模式
- 結構型模式之代理模式
- 結構模式之外觀模式
- 結構模式之享元模式
- 行為模式之策略模式
- 行為模式之模板模式
- 行為模式之觀察者模式
- 行為模式之責任鏈模式
- 行為模式之命令模式
- 行為模式之迭代器模式
- 行為模式之備忘錄模式
- 行為模式之狀態模式