Java設計模式-原型模式

簡介
原型模式是一種創(chuàng)建型設計模式,它允許在運行時通過復制現有對象來創(chuàng)建新對象,而不是通過構造函數創(chuàng)建。這個模式的核心思想是基于一個現有的對象克隆一個新的對象,這個過程對外部世界是透明的,就像對象從未被克隆過一樣。
原型模式的一個關鍵優(yōu)點是可以避免在創(chuàng)建對象時重復性地執(zhí)行復雜的初始化操作,從而提高了程序的性能和可維護性。與其他創(chuàng)建型模式相比,原型模式的一個顯著特點是允許使用原型對象來生成多個具有不同狀態(tài)的克隆對象。
與工廠模式相比,原型模式不需要創(chuàng)建具體的工廠類來創(chuàng)建新的對象,而是通過復制一個現有對象來生成新的對象。與建造者模式相比,原型模式不需要分步驟創(chuàng)建一個對象,而是通過克隆現有對象來生成新的對象。
實現
假設我們有一個名為Book
的類,它包含了書的基本屬性,如書名、作者和出版商。我們想要使用原型模式來復制這個類的對象,以便可以在程序中動態(tài)地創(chuàng)建多個不同狀態(tài)的Book
對象。我們可以先創(chuàng)建一個原型對象,然后使用該原型對象的克隆方法來創(chuàng)建新的對象。
下面是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
類包含了三個屬性:title
、author
和publisher
,以及一個clone
方法。clone
方法使用Java提供的Object.clone
方法來復制一個新的Book
對象。
下面是在Java中使用原型模式創(chuàng)建新的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() + ?")");
}
}
在這個示例中,我們首先創(chuàng)建一個原型對象prototype
,然后使用該對象的clone
方法來創(chuàng)建兩個新的Book
對象。我們分別修改了這兩個對象的屬性,以展示它們具有不同的狀態(tài)。最后,我們輸出了這兩個對象的屬性值。
原型模式的優(yōu)缺點
優(yōu)點
通過原型模式,我們可以避免創(chuàng)建復雜對象時的開銷。
原型模式提供了一種更加靈活的方式來創(chuàng)建新對象。
原型模式能夠保護現有對象的狀態(tài)。
缺點
在實現原型模式時,必須注意克隆對象的所有屬性,包括私有屬性和引用類型屬性。
如果原型對象的屬性包含大量數據,那么復制對象的成本將會很高。
需要實現
Cloneable
接口,并且需要重寫clone
方法,這會增加代碼量和復雜度。克隆對象時需要注意深淺拷貝的問題,以免出現意料之外的錯誤。