大話設計模式四:原型模式

一.模式定義

原型模式是對象創建型模式。

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)需要避免使用分層次的工廠類來創建分層次的對象,並且類的實例對象只有一個或很少的幾個組合狀態,通過複製原型對象得到新實例可能比使用構造函數創建一個新實例更加方便。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章