一、什麼是原型模式 通過複製一個已存在對象來生成一個新對象,被覆制的對象稱為原型; 二、補充說明 1、JAVA中Object的clone方法已經為什麼提供了複製對象的實現,且該方法為本地方法,性能好,在需要大量複製對象的情況,使用clone創建對象比new效率高; 補充下深拷貝和淺拷貝,深拷貝是通過
一、什麼是原型模式
通過複製一個已存在對象來生成一個新對象,被覆制的對象稱為原型;
二、補充說明
1、JAVA中Object的clone方法已經為什麼提供了複製對象的實現,且該方法為本地方法,性能好,在需要大量複製對象的情況,使用clone創建對象比new效率高;
補充下深拷貝和淺拷貝,深拷貝是通過拷貝記憶體(包括引用的對象)實現對象的創建;淺拷貝不拷貝引用的對象,但拷貝了引用的值,如果類的成員屬性中都是基本類型,不含對象,也是可以達到深拷貝的效果;深拷貝可以通過將對象序列化成位元組流以及反序列化實現,淺拷貝直接調用clone即可;
2、使用原型模式創建對象是沒有調用類的構造方法的;
三、角色
原型角色(ps,也可以搞成兩個,如抽象原型角色以及各個具體實現原型角色)
四、JAVA實現例子
java已經很好的支持原型模式了,使用很簡便,如下類,實現了Cloneable介面,即成了一個原型;
package com.pichen.dp.creationalpattern.prototype; public class Cell implements Cloneable{ private int cellId; public int getCellId() { return cellId; } public void setCellId(int cellId) { this.cellId = cellId; } public Cell(int id) { this.cellId = id; } @Override public Object clone() throws CloneNotSupportedException { System.out.println("clone a cell obj."); return (Cell) super.clone(); } }
使用原型,複製10個拷貝:
package com.pichen.dp.creationalpattern.prototype; public class Main { public static void main(String[] args) throws CloneNotSupportedException { Cell prototypeCell = new Cell(888); for(int i = 0; i < 10; i++){ Cell copyCell = (Cell) prototypeCell.clone(); System.out.println(copyCell.hashCode() + ":" + copyCell.getCellId()); } } }
觀察列印結果,hashcode不同,對象成員屬性一致,複製成功:
clone a cell obj. 25840096:888 clone a cell obj. 33040770:888 clone a cell obj. 23930419:888 clone a cell obj. 15142448:888 clone a cell obj. 22316618:888 clone a cell obj. 3969559:888 clone a cell obj. 10175206:888 clone a cell obj. 21307627:888 clone a cell obj. 24389376:888 clone a cell obj. 11317592:888