我的公众号原文:
建立型模式:原型模式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,第一时间获取文章推送阅读,也能够一块儿交流,交个朋友。