创建型模式:原型模式

  

文章首发:
创建型模式:原型模式

  

创建型模式:原型模式

  
  

五大创建型模式之五:原型模式。

     

简介

  

<强>姓名:原型模式

  

<强>英文名:

原型模式   

<强>价值观:效率第一

  

<强>个人介绍:

  

指定类型的对象来创建使用一个典型的实例,并创建新对象通过复制这一原型。
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
(来自《设计模式之禅》)

  

又到了一个系列的最后一篇文章了,今天是创建型模式的最后一篇。什么是创建型模式呢?创建型模式是对类的实例化过程进行抽象,使对象的创建和使用分离,从而使代码更加灵活。

  

我们平时使用最多的一种创建对象方式就是新的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本
  复印书籍:娱乐至死,第十本

创建型模式:原型模式