我的公衆號原文:
建立型模式:原型模式java
五大建立型模式之五:原型模式。git
姓名 :原型模式github
英文名 :Prototype Pattern設計模式
價值觀 :效率第一ide
我的介紹 :學習
Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.
用原型實例指定建立對象的種類,而且經過拷貝這些原型建立新的對象。
(來自《設計模式之禪》)優化
又到了一個系列的最後一篇文章了,今天是建立型模式的最後一篇。什麼是建立型模式呢?建立型模式是對類的實例化過程進行抽象,使對象的建立和使用分離,從而使代碼更加靈活。this
咱們平時使用最多的一種建立對象方式就是 new ABC(),直接經過構造方法來建立一個對象。經過原型模式來建立對象則不用調用構造方法,就能夠建立一個對象。下面來揭開它的面紗。prototype
前幾天有出版社的老師邀請寫書,鑑於深知本身水平還不足以出書,因此沒有合做,還在努力學習,之後有能力有機會再考慮這方面的事情。設計
今天的故事就從出書講起。咱們知道一本新書發版的時候,會複印不少冊,若是銷售得好,會有不少個印刷版本。咱們來了解複印一批書籍這個過程是怎麼實現的。小明寫下了下面這段代碼。
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() 方法,經過實現這個方法,能夠實現對象的拷貝,就是不用調用構造方法,直接經過對內存的拷貝來建立一個新的對象。這就是原型模式的實現方式,經過原型模式能夠提升建立對象的效率。
經過原型模式,繞過構造方法建立對象,利用內存直接拷貝對象,提升對象的建立性效率。在有大量的對象建立或者類初始化消耗多資源的場景下能夠利用原型模式來優化。固然在實現的過程當中,要注意淺拷貝與深拷貝的問題,防止寫出 bug,文章主要介紹原型模式,就不詳細說這個問題了,留給你們去擴展瞭解。
參考資料:《大話設計模式》、《Java設計模式》、《設計模式之禪》、《研磨設計模式》、《Head First 設計模式》
推薦閱讀:
建立型模式:單例模式
建立型模式:工廠方法
建立型模式:抽象工廠
建立型模式:原型模式
公衆號之設計模式系列文章
但願文章對您有所幫助,設計模式系列會持續更新,感興趣的同窗能夠關注公衆號:LieBrother,第一時間獲取文章推送閱讀,也能夠一塊兒交流,交個朋友。