簡介
原型模式是一種創(chuàng)建型設(shè)計(jì)模式件已,它允許在運(yùn)行時(shí)通過復(fù)制現(xiàn)有對象來創(chuàng)建新對象砾肺,而不是通過構(gòu)造函數(shù)創(chuàng)建掀潮。這個(gè)模式的核心思想是基于一個(gè)現(xiàn)有的對象克隆一個(gè)新的對象写穴,這個(gè)過程對外部世界是透明的浪汪,就像對象從未被克隆過一樣障贸。
原型模式的一個(gè)關(guān)鍵優(yōu)點(diǎn)是可以避免在創(chuàng)建對象時(shí)重復(fù)性地執(zhí)行復(fù)雜的初始化操作,從而提高了程序的性能和可維護(hù)性吟宦。與其他創(chuàng)建型模式相比篮洁,原型模式的一個(gè)顯著特點(diǎn)是允許使用原型對象來生成多個(gè)具有不同狀態(tài)的克隆對象。
與工廠模式相比殃姓,原型模式不需要?jiǎng)?chuàng)建具體的工廠類來創(chuàng)建新的對象袁波,而是通過復(fù)制一個(gè)現(xiàn)有對象來生成新的對象瓦阐。與建造者模式相比,原型模式不需要分步驟創(chuàng)建一個(gè)對象篷牌,而是通過克隆現(xiàn)有對象來生成新的對象睡蟋。
實(shí)現(xiàn)
假設(shè)我們有一個(gè)名為Book
的類,它包含了書的基本屬性枷颊,如書名戳杀、作者和出版商。我們想要使用原型模式來復(fù)制這個(gè)類的對象夭苗,以便可以在程序中動態(tài)地創(chuàng)建多個(gè)不同狀態(tài)的Book
對象信卡。我們可以先創(chuàng)建一個(gè)原型對象,然后使用該原型對象的克隆方法來創(chuàng)建新的對象题造。
下面是Book
類的代碼實(shí)現(xiàn):
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
類中實(shí)現(xiàn)了Cloneable
接口傍菇,這是使用原型模式必須的步驟。Book
類包含了三個(gè)屬性:title
界赔、author
和publisher
丢习,以及一個(gè)clone
方法。clone
方法使用Java提供的Object.clone
方法來復(fù)制一個(gè)新的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() + ")");
}
}
在這個(gè)示例中咐低,我們首先創(chuàng)建一個(gè)原型對象prototype
,然后使用該對象的clone
方法來創(chuàng)建兩個(gè)新的Book
對象袜腥。我們分別修改了這兩個(gè)對象的屬性见擦,以展示它們具有不同的狀態(tài)。最后瞧挤,我們輸出了這兩個(gè)對象的屬性值。
原型模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 通過原型模式儡湾,我們可以避免創(chuàng)建復(fù)雜對象時(shí)的開銷特恬。
- 原型模式提供了一種更加靈活的方式來創(chuàng)建新對象。
- 原型模式能夠保護(hù)現(xiàn)有對象的狀態(tài)徐钠。
缺點(diǎn)
- 在實(shí)現(xiàn)原型模式時(shí)癌刽,必須注意克隆對象的所有屬性,包括私有屬性和引用類型屬性尝丐。
- 如果原型對象的屬性包含大量數(shù)據(jù)显拜,那么復(fù)制對象的成本將會很高。
- 需要實(shí)現(xiàn)
Cloneable
接口爹袁,并且需要重寫clone
方法远荠,這會增加代碼量和復(fù)雜度。 - 克隆對象時(shí)需要注意深淺拷貝的問題失息,以免出現(xiàn)意料之外的錯(cuò)誤譬淳。
總結(jié)
原型模式是一種用于對象復(fù)制的設(shè)計(jì)模式档址。它通過復(fù)制現(xiàn)有對象來創(chuàng)建新的對象,從而降低了對象創(chuàng)建成本邻梆。雖然原型模式有一些缺點(diǎn)守伸,例如必須復(fù)制對象的所有屬性和克隆大量數(shù)據(jù)的成本,但是它仍然是一個(gè)有用的設(shè)計(jì)模式浦妄,特別是在需要?jiǎng)?chuàng)建相似對象或保護(hù)現(xiàn)有對象狀態(tài)的場景中尼摹。