当前位置: 首页 > 后端技术 > Java

PrototypePattern简介

时间:2023-04-01 16:18:57 Java

Java中的PrototypePattern模式属于创建模式,它提供了创建对象的最佳方式。用于在保持性能的同时创建重复对象。该模式实现了一个原型接口,用于创建当前对象的克隆。当直接创建对象成本比较高时使用这种模式。例如,需要在昂贵的数据库操作之后创建一个对象。我们可以缓存这个对象,在下一次请求时返回它的克隆,并在需要时更新数据库,从而减少数据库调用。浅克隆类Book实现Cloneable接口并重写克隆方法publicclassBookimplementsCloneable{privateStringname;//书名privateDatepublishDate;//发布日期publicBook(){}publicBook(Stringname,DatepublishDate){this.name=名称;this.publishDate=publishDate;}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicDategetPublishDate(){返回发布日期;}publicvoidsetPublishDate(DatepublishDate){this.publishDate=publishDate;}@OverrideprotectedObjectclone()抛出CloneNotSupportedException{returnsuper.clone();}@OverridepublicStringtoString(){return"Book{"+"name='"+name+'\''+",publishDate="+publishDate+'}';}}测试类publicclassTest{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{Stringname="Java设计模式";日期publishDate=newDate();书book=newBook(name,publishDate);//克隆对象Bookclone=(Book)book.clone();System.out.println(书籍);System.out.println(book.hashCode());System.out.println(克隆);System.out.println(clone.hashCode());System.out.println("===================");publishDate.setTime(publishDate.getTime()+2000);//修改时间System.out.println(book);System.out.println(book.hashCode());System.out.println(克隆);System.out.println(clone.hashCode());/***测试结果:修改时间,源对象和克隆对象时间*Book{name='JavaDesignPatterns',publishDate=WedDec2912:17:33CST2021}*2093631819*Book{name='Java设计模式',publishDate=WedDec2912:17:33CST2021}*2074407503*====================*Book{name='JavaDesignPatterns',publishDate=2021年12月29日星期三12:17:35CST}*2093631819*Book{name='JavaDesignPatterns',publishDate=WedDec2912:17:35CST2021}*2074407503*/}}测试结果Book{name='JavaDesignPatterns',publishDate=WedDec2912:17:33CST2021}2093631819Book{name='JavaDesignPatterns',publishDate=WedDec2912:17:33CST2021}2074407503====================Book{name='JavaDesignPattern',publishDate=WedDec2912:17:35CST2021}2093631819Book{name='JavaDesignPattern',publishDate=WedDec2912:17:35CST2021}2074407503深度克隆类书籍实现Cloneable接口并覆盖克隆方法publicclassBookimplementsCloneable{privateStringname;//书名privateDatepublishDate;//出版日期publicBook(){}publicBook(Stringname,DatepublishDate){this.name=姓名;this.publishDate=publishDate;}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicDategetPublishDate(){返回发布日期;}publicvoidsetPublishDate(DatepublishDate){this.publishDate=发布日期;}@OverrideprotectedObjectclone()throwsCloneNotSupportedException{Objectobj=super.clone();书book=(Book)obj;//克隆源对象的属性,即深克隆book.publishDate=(Date)book.publishDate.clone();返回对象;}@OverridepublicStringtoString(){return"Book{"+"name='"+name+'\''+",publishDate="+publishDate+'}';}}测试类publicclassTest{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{Stringname="Javadesignpattern";日期publishDate=newDate();书book=newBook(name,publishDate);//克隆对象Bookclone=(Book)book.clone();System.out.println(书籍);System.out.println(book.hashCode());System.out.println(克隆);System.out.println(clone.hashCode());System.out.println("===================");发布数据e.setTime(publishDate.getTime()+2000);System.out.println(书籍);System.out.println(book.hashCode());System.out.println(克隆);System.out.println(clone.hashCode());/***测试结果:修改了时间,源对象的时间变了,但是克隆对象的时间没有变*Book{name='JavaDesignMode',publishDate=WedDec2912:41:47CST2021}*2093631819*Book{name='JavaDesignPatterns',publishDate=WedDec2912:41:47CST2021}*2074407503*==================*Book{name='JavaDesignPatterns',publishDate=WedDec2912:41:49CST2021}*2093631819*Book{name='JavaDesignPatterns',publishDate=WedDec2912:41:47CST2021}*2074407503*/}}测试结果Book{name='JavaDesignPatterns',publishDate=WedDec2912:41:47CST2021}2093631819Book{name='JavaDesignPatterns',publishDate=WedDec2912:41:47CST2021}2074407503===================Book{name='JavaDesignPatterns',publishDate=WedDec2912:41:49CST2021}2093631819Book{name='Java设计模式',publishDate=2021年12月29日星期三12:41:47CST}2074407503