Java設計模式-原型模式

2023-05-06 12:00:22

簡介

原型模式是一種建立型設計模式,它允許在執行時通過複製現有物件來建立新物件,而不是通過建構函式建立。這個模式的核心思想是基於一個現有的物件克隆一個新的物件,這個過程對外部世界是透明的,就像物件從未被克隆過一樣。

原型模式的一個關鍵優點是可以避免在建立物件時重複性地執行復雜的初始化操作,從而提高了程式的效能和可維護性。與其他建立型模式相比,原型模式的一個顯著特點是允許使用原型物件來生成多個具有不同狀態的克隆物件。

與工廠模式相比,原型模式不需要建立具體的工廠類來建立新的物件,而是通過複製一個現有物件來生成新的物件。與建造者模式相比,原型模式不需要分步驟建立一個物件,而是通過克隆現有物件來生成新的物件。

實現

假設我們有一個名為Book的類,它包含了書的基本屬性,如書名、作者和出版商。我們想要使用原型模式來複制這個類的物件,以便可以在程式中動態地建立多個不同狀態的Book物件。我們可以先建立一個原型物件,然後使用該原型物件的克隆方法來建立新的物件。

下面是Book類的程式碼實現:

public class Book implements Cloneable {
    private String title;
    private String author;
    private String publisher;

    public Book(String title, String author, String publisher) {
        this.title = title;
        this.author = author;
        this.publisher = publisher;
    }

    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

    public String getPublisher() {
        return publisher;
    }

    public Book clone() {
        try {
            return (Book) super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}


我們在Book類中實現了Cloneable介面,這是使用原型模式必須的步驟。Book類包含了三個屬性:titleauthorpublisher,以及一個clone方法。clone方法使用Java提供的Object.clone方法來複制一個新的Book物件。

下面是在Java中使用原型模式建立新的Book物件的範例程式碼:

public class PrototypeDemo {
    public static void main(String[] args) {
        Book prototype = new Book("Design Patterns", "Erich Gamma, Richard Helm, Ralph Johnson, 
                                  "John Vlissides","Addison-Wesley Professional");
	Book book1 = prototype.clone();
	book1.setTitle("Head First Design Patterns");
	System.out.println("Book 1: " + book1.getTitle() + " by " + book1.getAuthor() +
                       " (published by " + book1.getPublisher() + ")");
	Book book2 = prototype.clone();
	book2.setAuthor("Joshua Bloch");
	System.out.println("Book 2: " + book2.getTitle() + " by " + book2.getAuthor() + 
                       " (published by " + book2.getPublisher() + 	")");
	}
}

在這個範例中,我們首先建立一個原型物件prototype,然後使用該物件的clone方法來建立兩個新的Book物件。我們分別修改了這兩個物件的屬性,以展示它們具有不同的狀態。最後,我們輸出了這兩個物件的屬性值。

原型模式的優缺點

優點

  1. 通過原型模式,我們可以避免建立複雜物件時的開銷。
  2. 原型模式提供了一種更加靈活的方式來建立新物件。
  3. 原型模式能夠保護現有物件的狀態。

缺點

  1. 在實現原型模式時,必須注意克隆物件的所有屬性,包括私有屬性和參照型別屬性。
  2. 如果原型物件的屬性包含大量資料,那麼複製物件的成本將會很高。
  3. 需要實現Cloneable介面,並且需要重寫clone方法,這會增加程式碼量和複雜度。
  4. 克隆物件時需要注意深淺拷貝的問題,以免出現意料之外的錯誤。

總結

原型模式是一種用於物件複製的設計模式。它通過複製現有物件來建立新的物件,從而降低了物件建立成本。雖然原型模式有一些缺點,例如必須複製物件的所有屬性和克隆大量資料的成本,但是它仍然是一個有用的設計模式,特別是在需要建立相似物件或保護現有物件狀態的場景中。