大話設計模式之:原型模式
一.模式定義
原型模式是物件建立型模式。
Prototype Pattern: Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype.
用原型例項指定建立物件的種類,並且通過複製該原型建立新的物件。原型模式允許一個物件再建立另外一個可定製的物件,無須知道任何建立的細節。
二.模式要素
1.抽象原型
2.具體原型
3.使用者
三.舉例說明
《黑客帝國》大家都看過,裡面有一個反派角色Agent史密斯,就是下面這位。
能夠通過複製來創造無數個自己,就像下面這樣。
四.模式例項
工程結構如下:
1.Agent.java(實現Cloneable介面)
package prototype; /** * @program: DesignModes * @description:Agent * @author: Lei Dong * @create: 2018-09-22 11:14 **/ public class Agent implements Cloneable { private String name; private String sex; private String ability; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAbility() { return ability; } public void setAbility(String ability) { this.ability = ability; } @Override public Agent clone() { Agent agent = null; try { agent = (Agent) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return agent; } void showInfo() { System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); System.out.println("姓名:" + this.name); System.out.println("性別:" + this.sex); System.out.println("能力:" + this.ability); System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); } }
2.Main.java
package prototype; /** * @program: DesignModes * @description:Main * @author: Lei Dong * @create: 2018-09-22 11:03 **/ public class Main { public static void main(String[] args) { Agent agent = new Agent(); agent.setName("史密斯"); agent.setSex("男"); agent.setAbility("自我複製、未來預知、飛行"); agent.showInfo(); Agent agent1 = agent.clone(); agent.showInfo(); agent1.setName("史密斯(克隆體)"); agent1.setSex("男(克隆體)"); agent1.setAbility("未來預知、飛行(克隆體)"); agent1.showInfo(); } }
執行結果:
五.總結
1.原型模式的優點 (1)當建立新的物件例項較為複雜時,使用原型模式可以簡化物件的建立過程,通過一個已有例項可以提高新例項的建立效率。 (2)可以動態增加或減少產品類。 (3)可以使用深拷貝的方式儲存物件的狀態。
2.原型模式的缺點 (1)需要為每一個類配備一個克隆方法,而且這個克隆方法需要對類的功能進行通盤考慮,這對全新的類來說不是很難,但對已有的類進行改造時,不一定是件容易的事,必須修改其原始碼,違背了“開閉原則”。 (2)在實現深拷貝時需要編寫較為複雜的程式碼。
3.原型模式適用環境 在以下情況下可以使用原型模式: (1)建立新物件成本較大,新的物件可以通過原型模式對已有物件進行復制來獲得,如果是相似物件,則可以對其屬性稍作修改。 (2)系統要儲存物件的狀態,而物件的狀態變化很小,或者物件本身佔記憶體不大的時候,也可以使用原型模式配合備忘錄模式來應用。相反,如果物件的狀態變化很大,或者物件佔用的記憶體很大,那麼採用狀態模式會比原型模式更好。 (3)需要避免使用分層次的工廠類來建立分層次的物件,並且類的例項物件只有一個或很少的幾個組合狀態,通過複製原型物件得到新例項可能比使用建構函式建立一個新例項更加方便。