定義 用原型實例指定創建對象的種類,並且通過複製這些原型創建新的對象。 類圖如下: 原型模式涉及3個角色。 客戶(Client)角色:該角色提出創建對象的請求。 抽象原型(Prototype)角色:該角色是一個抽象角色,通常由一個Java介面或抽象類實現,給出所有的具體原型類所需要的介面。 具體原型 ...
定義
- 用原型實例指定創建對象的種類,並且通過複製這些原型創建新的對象。
類圖如下:
原型模式涉及3個角色。
- 客戶(Client)角色:該角色提出創建對象的請求。
- 抽象原型(Prototype)角色:該角色是一個抽象角色,通常由一個Java介面或抽象類實現,給出所有的具體原型類所需要的介面。
- 具體原型(Concrete Prototype)角色:該角色是被覆制的對象,必須實現抽象原型介面。
Java中內置了克隆機制,Object類具有一個clone()方法,能夠實現對象的克隆,使一個類支持克隆需要以下兩步。
- 實現Cloneable介面;
- 覆蓋Object的clone()方法,完成對象的克隆操作,通常只需要調用Object的clone方法即可。為了使外部能夠調用此類的clone()方法,可以將可訪問性修改為public。代碼如下。
Prototype.java
public interface Prototype extends Cloneable { // 克隆方法 Prototype clone(); }
具體原型ConcretePrototype實現clone()方法,代碼如下。
ConcretePrototype.java
public class ConcretePrototype implements Prototype { @Override public Prototype clone() { try { return (Prototype) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } }
客戶類Client的代碼如下:
Client.java
public class Client { public void operation(Prototype example) { // 得到example副本 Prototype p = example.clone(); } }
優點
- 性能優良:原型模式是對記憶體二進位流的複製,要比直接new一個對象性能好,特別是在一個迴圈體內產生大量的對象時,原型模式可以更好地體現其優點。
- 逃避構造函數的約束:這既是優點也是缺點,直接在記憶體中複製,構造函數是不會執行的,因此減少了約束,需要在實際應用時進行權衡考慮。
使用場景
- 資源優化場景,類初始化需要消耗非常多的資源,這個資源包括數據、硬體資源等。
- 性能和安全要求的場景。通過new產生一個對象需要非常繁瑣的數據準備或訪問許可權,可以使用原型模式。
- 一個對象多個修改者的場景,一個對象需要提供給其他對象訪問,而且各個調用者可能都需要修改其值時,可以考慮使用原型模式複製多個對象供調用者使用。
在實際項目中,原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過clone方法創建一個對象,然後由工廠方法提供給調用者。
設計模式Java版.電子工業出版社 p65