您好,登錄后才能下訂單哦!
文章首發:
創建型模式:原型模式
五大創建型模式之五:原型模式。
姓名 :原型模式
英文名 :Prototype Pattern
價值觀 :效率第一
個人介紹 :
Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.
用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。
(來自《設計模式之禪》)
又到了一個系列的最后一篇文章了,今天是創建型模式的最后一篇。什么是創建型模式呢?創建型模式是對類的實例化過程進行抽象,使對象的創建和使用分離,從而使代碼更加靈活。
我們平時使用最多的一種創建對象方式就是 new ABC(),直接通過構造方法來創建一個對象。通過原型模式來創建對象則不用調用構造方法,就可以創建一個對象。下面來揭開它的面紗。
前幾天有出版社的老師邀請寫書,鑒于深知自己水平還不足以出書,所以沒有合作,還在努力學習,以后有能力有機會再考慮這方面的事情。
今天的故事就從出書講起。我們知道一本新書發版的時候,會復印很多冊,如果銷售得好,會有很多個印刷版本。我們來了解復印一批書籍這個過程是怎么實現的。小明寫下了下面這段代碼。
public class NoPrototypeTest {
public static void main(String[] args) {
for (int i = 1; i <= 10; i ++) {
Book book = new Book("娛樂至死", "尼爾波茲曼", "社會科學", "XXXX");
System.out.println("復印書籍:" + 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;
}
}
// 打印結果:
實例化書籍:娛樂至死
復印書籍:娛樂至死,第 1 本
實例化書籍:娛樂至死
復印書籍:娛樂至死,第 2 本
實例化書籍:娛樂至死
復印書籍:娛樂至死,第 3 本
實例化書籍:娛樂至死
復印書籍:娛樂至死,第 4 本
實例化書籍:娛樂至死
復印書籍:娛樂至死,第 5 本
實例化書籍:娛樂至死
復印書籍:娛樂至死,第 6 本
實例化書籍:娛樂至死
復印書籍:娛樂至死,第 7 本
實例化書籍:娛樂至死
復印書籍:娛樂至死,第 8 本
實例化書籍:娛樂至死
復印書籍:娛樂至死,第 9 本
實例化書籍:娛樂至死
復印書籍:娛樂至死,第 10 本
上面小明的代碼復印了 10 本《娛樂至死》,代碼邏輯沒有問題,有個問題就是復印一本就實例化一次書籍,這個實例化可以減少么?使用原型模式可以實現。小明根據這些提示,重新修改了代碼。
public class PrototypeTest {
public static void main(String[] args) {
Book2 book1 = new ConcreteBook("娛樂至死", "尼爾波茲曼", "社會科學", "XXXX");
System.out.println("復印書籍:" + book1.getName() + ",第 " + 1 + " 本");
for (int i = 2; i <= 10; i ++) {
Book2 book2 = (Book2) book1.clone();
System.out.println("復印書籍:" + 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);
}
}
打印結果:
實例化書籍:娛樂至死
復印書籍:娛樂至死,第 1 本
復印書籍:娛樂至死,第 2 本
復印書籍:娛樂至死,第 3 本
復印書籍:娛樂至死,第 4 本
復印書籍:娛樂至死,第 5 本
復印書籍:娛樂至死,第 6 本
復印書籍:娛樂至死,第 7 本
復印書籍:娛樂至死,第 8 本
復印書籍:娛樂至死,第 9 本
復印書籍:娛樂至死,第 10 本
看,打印結果和第一次實現的結果完全不一樣,這一次只實例化了一次,后面復印的書籍都沒有實例化。我們看看代碼的變化,代碼中最最主要的就是 Book2 實現了 Cloneable 接口,這個接口有個 clone() 方法,通過實現這個方法,可以實現對象的拷貝,就是不用調用構造方法,直接通過對內存的拷貝來創建一個新的對象。這就是原型模式的實現方式,通過原型模式可以提高創建對象的效率。
代碼:
Prototype Pattern
通過原型模式,繞過構造方法創建對象,利用內存直接拷貝對象,提高對象的創建性效率。在有大量的對象創建或者類初始化消耗多資源的場景下可以利用原型模式來優化。當然在實現的過程中,要注意淺拷貝與深拷貝的問題,防止寫出 bug,文章主要介紹原型模式,就不詳細說這個問題了,留給大家去擴展了解。
推薦閱讀:
單一職責原則(方法:修改名字還是密碼?接口:洗碗、買菜還是倒垃圾?類:注冊、登錄和注銷)
里氏替換原則(我兒來自新東方烹飪)
依賴倒置原則(摳門的飯店老板)
接口隔離原則(小伙子的作坊)
迪米特法則(手機上看電子書)
開閉原則(社保這點事)
創建型模式:單例模式(小明就只有 1 輛車)
創建型模式:工廠方法(小明家的車庫)
創建型模式:抽象工廠(寶馬車就得用寶馬輪胎和寶馬方向盤)
創建型模式:建造者模式(湯這么煲)
公眾號后臺回復『大禮包』獲取 Java、Python、IOS 等教程
加個人微信備注『教程』獲取架構師、機器學習等教程
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。