原型模式
原型模式:使用原型實例指定待創建對象的類型,並且通過複製這個原型來創建新的對象
說白了,原型模式核心便是Ctrl+C 、Ctrl + V。也就是克隆(clone)。
使用場景
- 創建一個對象,這個對象過於複雜,可以使用原型模式來進行復制一個對象。
- 需要提供數據對象,同時有需要避免外部對數據對象進行修改。
- 系統要保存對象狀態的,而對象的狀態改變很小
原型模式的角色
- Client: 使用者。
- Prototype: 接口(或抽象類),聲明具備clone能力。
- ConcretePrototype: 具體的原型類。
深拷貝和淺拷貝
- 我們以ArrayList()爲例
ArrayList<String> a = new ArrayList();
ArrayList<String> b = a;
淺拷貝,就是一個對象通過賦值的方式直接傳遞對象在內存中的內存地址。
ArrayList<String> a = new ArrayList();
ArrayList<String> b = a.clone();
//或者
ArrayList<String> c = new ArrayList(a);
深拷貝,使用clone方法,關於ArrayList的clone方法:
public Object clone() {
try {
ArrayList<?> v = (ArrayList<?>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError(e);
}
}
原型模式優缺點
優點 | 1、當創建的對象實例較爲複雜的時候,使用原型模式可以簡化對象的創建過程2、擴展性好,由於寫原型模式的時候使用了抽象原型類,在客戶端進行編程的時候可以將具體的原型類通過配置進行讀取。3、可以使用深度克隆來保存對象的狀態,使用原型模式進行復制。 |
---|---|
缺點 | 1、需要爲每一個類配備一個克隆方法,而且該克隆方法位於一個類的裏面,當對已有的類經行改造時需要修改源代碼,違背了開閉原則。2、在實現深克隆的時需要編寫較爲複雜的代碼,而且當對象之間存在多重嵌套引用的時候,爲了實現深克隆,每一層對象對應的類都必須支持深克隆,實現相對麻煩。 |
總結
原型模式的本質,就是克隆,可以在某些場景中提升構建對象的效率,也可以保護性拷貝,可以通過返回一個返回對象的形式,實現只讀的限制。