設計模式入門:原型模式

weixin_34006468發表於2018-07-31

UML類圖

9709135-3dae3fde28b402de.png
原型模式

程式碼示例

  實際應用中,原型模式可以簡單理解為克隆操作。在大多數物件導向程式語言中,實現克隆操作並不複雜,對於Java,我們只需繼承Cloneable介面,並重寫Object的clone()即可(非必須)。

public class Teacher implements Cloneable {

    /**
     * 姓名
     */
    private String name;

    private Teacher(String name) {
        try {
            // 模擬初始化資源耗時較多
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.name = name;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                '}';
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Teacher teacher = new Teacher("李老師");
        // output: teacher = Teacher{name='李老師'}
        System.out.println("teacher = " + teacher);

        // clone is much faster
        Teacher cloneTeacher = (Teacher) teacher.clone();
        // output: cloneTeacher = Teacher{name='李老師'}
        System.out.println("cloneTeacher = " + cloneTeacher);
    }

}

  clone()方法會丟擲未檢查的CloneNotSupportedException,通過原始碼瞭解下什麼情況下會產生該異常。

9709135-7e4ddb79ea50f99a.png
Object Clone()

  該方法有native修飾,這說明它的具體實現在底層(參考JNI)。文件說明,在當前克隆類沒有實現Cloneable介面的情況下,該異常將會觸發。另外,還有這麼一句值得我們留意,Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation.,這說明clone()實現的是淺拷貝而不是深拷貝(下個話題深入)。最後,重寫clone()是非必須的,一般重寫只是用來提高方法的訪問許可權。

總結思考

  原型模式通過()拷貝現有物件以生成新的物件,屬於建立型模式中的一種。對比通過new的方式來例項化物件,這種模式不用重新初始化物件,可以動態的獲得物件執行時的狀態,也適用於需要優化效能的場景,例如當類的初始化需要消耗非常多的資源,就可以考慮使用這種模式了。
  接觸原型模式,不可避免的就是關於淺拷貝和深拷貝的問題,下一篇準備深入瞭解下這個話題。

示例程式碼

相關文章