新聞中心
文章首發(fā):
創(chuàng)建型模式:原型模式
成都創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計,網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十余年品質(zhì),值得信賴!
五大創(chuàng)建型模式之五:原型模式。
簡介
姓名:原型模式
英文名:Prototype Pattern
價值觀:效率第一
個人介紹:
Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.
用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。
(來自《設(shè)計模式之禪》)
又到了一個系列的最后一篇文章了,今天是創(chuàng)建型模式的最后一篇。什么是創(chuàng)建型模式呢?創(chuàng)建型模式是對類的實例化過程進(jìn)行抽象,使對象的創(chuàng)建和使用分離,從而使代碼更加靈活。
我們平時使用最多的一種創(chuàng)建對象方式就是 new ABC(),直接通過構(gòu)造方法來創(chuàng)建一個對象。通過原型模式來創(chuàng)建對象則不用調(diào)用構(gòu)造方法,就可以創(chuàng)建一個對象。下面來揭開它的面紗。
你要的故事
前幾天有出版社的老師邀請寫書,鑒于深知自己水平還不足以出書,所以沒有合作,還在努力學(xué)習(xí),以后有能力有機會再考慮這方面的事情。
今天的故事就從出書講起。我們知道一本新書發(fā)版的時候,會復(fù)印很多冊,如果銷售得好,會有很多個印刷版本。我們來了解復(fù)印一批書籍這個過程是怎么實現(xiàn)的。小明寫下了下面這段代碼。
public class NoPrototypeTest {
public static void main(String[] args) {
for (int i = 1; i <= 10; i ++) {
Book book = new Book("娛樂至死", "尼爾波茲曼", "社會科學(xué)", "XXXX");
System.out.println("復(fù)印書籍:" + book.getName() + ",第 " + i + " 本");
}
}
}
class Book {
private String name;
private String author;
private String type;
private String content;
public Book(String name, String author, String type, String content) {
this.name = name;
this.author = author;
this.type = type;
this.content = content;
System.out.println("實例化書籍:" + this.name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
// 打印結(jié)果:
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 1 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 2 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 3 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 4 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 5 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 6 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 7 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 8 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 9 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 10 本
上面小明的代碼復(fù)印了 10 本《娛樂至死》,代碼邏輯沒有問題,有個問題就是復(fù)印一本就實例化一次書籍,這個實例化可以減少么?使用原型模式可以實現(xiàn)。小明根據(jù)這些提示,重新修改了代碼。
public class PrototypeTest {
public static void main(String[] args) {
Book2 book1 = new ConcreteBook("娛樂至死", "尼爾波茲曼", "社會科學(xué)", "XXXX");
System.out.println("復(fù)印書籍:" + book1.getName() + ",第 " + 1 + " 本");
for (int i = 2; i <= 10; i ++) {
Book2 book2 = (Book2) book1.clone();
System.out.println("復(fù)印書籍:" + book2.getName() + ",第 " + i + " 本");
}
}
}
/**
* 抽象類
*/
abstract class Book2 implements Cloneable {
private String name;
private String author;
private String type;
private String content;
public Book2(String name, String author, String type, String content) {
this.name = name;
this.author = author;
this.type = type;
this.content = content;
System.out.println("實例化書籍:" + this.name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
protected Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
/**
* 具體類
*/
class ConcreteBook extends Book2 {
public ConcreteBook(String name, String author, String type, String content) {
super(name, author, type, content);
}
}
打印結(jié)果:
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 1 本
復(fù)印書籍:娛樂至死,第 2 本
復(fù)印書籍:娛樂至死,第 3 本
復(fù)印書籍:娛樂至死,第 4 本
復(fù)印書籍:娛樂至死,第 5 本
復(fù)印書籍:娛樂至死,第 6 本
復(fù)印書籍:娛樂至死,第 7 本
復(fù)印書籍:娛樂至死,第 8 本
復(fù)印書籍:娛樂至死,第 9 本
復(fù)印書籍:娛樂至死,第 10 本
看,打印結(jié)果和第一次實現(xiàn)的結(jié)果完全不一樣,這一次只實例化了一次,后面復(fù)印的書籍都沒有實例化。我們看看代碼的變化,代碼中最最主要的就是 Book2 實現(xiàn)了 Cloneable 接口,這個接口有個 clone() 方法,通過實現(xiàn)這個方法,可以實現(xiàn)對象的拷貝,就是不用調(diào)用構(gòu)造方法,直接通過對內(nèi)存的拷貝來創(chuàng)建一個新的對象。這就是原型模式的實現(xiàn)方式,通過原型模式可以提高創(chuàng)建對象的效率。
代碼:
Prototype Pattern
總結(jié)
通過原型模式,繞過構(gòu)造方法創(chuàng)建對象,利用內(nèi)存直接拷貝對象,提高對象的創(chuàng)建性效率。在有大量的對象創(chuàng)建或者類初始化消耗多資源的場景下可以利用原型模式來優(yōu)化。當(dāng)然在實現(xiàn)的過程中,要注意淺拷貝與深拷貝的問題,防止寫出 bug,文章主要介紹原型模式,就不詳細(xì)說這個問題了,留給大家去擴(kuò)展了解。
推薦閱讀:
單一職責(zé)原則(方法:修改名字還是密碼?接口:洗碗、買菜還是倒垃圾?類:注冊、登錄和注銷)
里氏替換原則(我兒來自新東方烹飪)
依賴倒置原則(摳門的飯店老板)
接口隔離原則(小伙子的作坊)
迪米特法則(手機上看電子書)
開閉原則(社保這點事)
創(chuàng)建型模式:單例模式(小明就只有 1 輛車)
創(chuàng)建型模式:工廠方法(小明家的車庫)
創(chuàng)建型模式:抽象工廠(寶馬車就得用寶馬輪胎和寶馬方向盤)
創(chuàng)建型模式:建造者模式(湯這么煲)
公眾號后臺回復(fù)『大禮包』獲取 Java、Python、IOS 等教程
加個人微信備注『教程』獲取架構(gòu)師、機器學(xué)習(xí)等教程
新聞標(biāo)題:創(chuàng)建型模式:原型模式
文章來源:http://www.dlmjj.cn/article/gpcses.html