文章首发:
创建型模式:原型模式
五大创建型模式之五:原型模式。
引用>简介
<强>姓名强>:原型模式
<强>英文名强>:
原型模式<强>价值观强>:效率第一
<强>个人介绍强>:
指定类型的对象来创建使用一个典型的实例,并创建新对象通过复制这一原型。
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
(来自《设计模式之禅》)又到了一个系列的最后一篇文章了,今天是创建型模式的最后一篇。什么是创建型模式呢?创建型模式是对类的实例化过程进行抽象,使对象的创建和使用分离,从而使代码更加灵活。
我们平时使用最多的一种创建对象方式就是新的ABC(),直接通过构造方法来创建一个对象。通过原型模式来创建对象则不用调用构造方法,就可以创建一个对象。下面来揭开它的面纱。
你要的故事
前几天有出版社的老师邀请写书,鉴于深知自己水平还不足以出书,所以没有合作,还在努力学习,以后有能力有机会再考虑这方面的事情。
今天的故事就从出书讲起。我们知道一本新书发版的时候,会复印很多册,如果销售得好,会有很多个印刷版本。我们来了解复印一批书籍这个过程是怎么实现的。小明写下了下面这段代码。
<代码类="语言java ">公共类NoPrototypeTest { 公共静态void main (String [] args) { for (int i=1;我& lt;=10;我+ +){ 书书=new书(“娱乐至死”,“尼尔波兹曼”、“社会科学”、“XXXX”); system . out。println(“复印书籍:“+ book.getName() + "第" +我+“本”); } } } 类的书{ 私人字符串名称; 私人字符串作者; 私人字符串类型; 私人字符串内容; 公共图书(字符串名称,字符串作者、字符串类型字符串内容){ this.name=名称; 这一点。作者=作者; 这一点。类型=类型; 这一点。内容=内容; system . out。println(“实例化书籍:“+ this.name); } 公共字符串getName () { 返回名称; } 公共空间setName(字符串名称){ this.name=名称; } 公共字符串getAuthor () { 返回作者; } 公共空间setAuthor(字符串作者){ 这一点。作者=作者; } 公共字符串方法(){ 返回类型; } 公共空间setType (String类型){ 这一点。类型=类型; } 公共字符串getContent () { 返回内容; } 公共空间setContent(字符串内容){ 这一点。内容=内容; } }//打印结果: 实例化书籍:娱乐至死 复印书籍:娱乐至死,第1本 实例化书籍:娱乐至死 复印书籍:娱乐至死,第2本 实例化书籍:娱乐至死 复印书籍:娱乐至死,第3本 实例化书籍:娱乐至死 复印书籍:娱乐至死,第4本 实例化书籍:娱乐至死 复印书籍:娱乐至死,第5本 实例化书籍:娱乐至死 复印书籍:娱乐至死,第6本 实例化书籍:娱乐至死 复印书籍:娱乐至死,第7本 实例化书籍:娱乐至死 复印书籍:娱乐至死,第8本 实例化书籍:娱乐至死 复印书籍:娱乐至死,第9本 实例化书籍:娱乐至死 复印书籍:娱乐至死,第十本 代码>上面小明的代码复印了10本《娱乐至死》,代码逻辑没有问题,有个问题就是复印一本就实例化一次书籍,这个实例化可以减少么?使用原型模式可以实现。小明根据这些提示,重新修改了代码。
<代码类="语言java ">公共类PrototypeTest { 公共静态void main (String [] args) { Book2 book1=new ConcreteBook(“娱乐至死”,“尼尔波兹曼”、“社会科学”、“XXXX”); system . out。println(“复印书籍:“+ book1.getName() + "第" + 1 +“本”); for (int i=2;我& lt;=10;我+ +){ Book2 Book2=(Book2) book1.clone (); system . out。println(“复印书籍:“+ book2.getName() + "第" +我+“本”); } } }/* * *抽象类 */抽象类Book2实现可克隆{ 私人字符串名称; 私人字符串作者; 私人字符串类型; 私人字符串内容; 公共Book2(字符串名称,字符串作者、字符串类型字符串内容){ this.name=名称; 这一点。作者=作者; 这一点。类型=类型; 这一点。内容=内容; system . out。println(“实例化书籍:“+ this.name); } 公共字符串getName () { 返回名称; } 公共空间setName(字符串名称){ this.name=名称; } 公共字符串getAuthor () { 返回作者; } 公共空间setAuthor(字符串作者){ 这一点。作者=作者; } 公共字符串方法(){ 返回类型; } 公共空间setType (String类型){ 这一点。类型=类型; } 公共字符串getContent () { 返回内容; } 公共空间setContent(字符串内容){ 这一点。内容=内容; } @Override 保护对象克隆(){ 尝试{ 返回super.clone (); }捕捉(CloneNotSupportedException e) { e.printStackTrace (); } 返回null; } }/* * *具体类 */类ConcreteBook延伸Book2 { 公共ConcreteBook(字符串名称,字符串作者、字符串类型字符串内容){ 超级(名称、作者、类型、内容); } } 打印结果: 实例化书籍:娱乐至死 复印书籍:娱乐至死,第1本 复印书籍:娱乐至死,第2本 复印书籍:娱乐至死,第3本 复印书籍:娱乐至死,第4本 复印书籍:娱乐至死,第5本 复印书籍:娱乐至死,第6本 复印书籍:娱乐至死,第7本 复印书籍:娱乐至死,第8本 复印书籍:娱乐至死,第9本 复印书籍:娱乐至死,第十本创建型模式:原型模式