个人公众号原文:
创建型模式:原型模式
五大创建型模式之五:原型模式。
简介姓名 :原型模式
英文名 :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 本