原型模式 骑猪看日落 2021-09-17 01:08 289阅读 0赞 原型模式:用原型实例指定创建指定对象的种类,并且通过复制这些原型创建新的对象,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 注意:如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但是不复制引用的对象,因此,原始对象及其复本引用同一对象。 潜复制:被复制对象的所有变量都含有原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。 深复制:把引用对象的变量指向复制过来的新对象,而不是原有的被引用的对象; 潜复制实例UML图 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdfc2h1eXU_size_16_color_FFFFFF_t_70][] 深复制实例UML图: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdfc2h1eXU_size_16_color_FFFFFF_t_70 1][] 潜复制代码: /** * @author Shuyu.Wang * @package:com.shuyu.prototype * @description: * @date 2018-11-16 23:11 **/ @Data public class WorkExperience { private String workDate; private String company; } /** * @author Shuyu.Wang * @package:com.shuyu.prototype * @description:原型类,实现Cloneable,重写clone(),实现浅复制 * @date 2018-11-16 23:05 **/ @Slf4j public class Resume implements Cloneable{ private String name; private String sex; private String age; private WorkExperience workExperience; public Resume(String name){ this.name=name; workExperience=new WorkExperience(); } public void setPersonInfo(String sex,String age){ this.sex=sex; this.age=age; } public void setWorkExperience(String workDate,String company){ workExperience.setWorkDate(workDate); workExperience.setCompany(company); } public void show(){ log.info("name="+name,",sex="+sex,",age="+age); log.info("company="+workExperience.getCompany(),"workDate="+workExperience.getWorkDate()); } @Override public Object clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } } 深复制代码: /** * @author Shuyu.Wang * @package:com.shuyu.prototype * @description: * @date 2018-11-16 23:11 **/ @Data public class WorkExperience2 implements Cloneable{ private String workDate; private String company; @Override public Object clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } } /** * @author Shuyu.Wang * @package:com.shuyu.prototype * @description:原型类,实现Cloneable,重写clone(),实现深复制 * @date 2018-11-16 23:05 **/ @Slf4j public class Resume2 implements Cloneable{ private String name; private String sex; private String age; private WorkExperience2 workExperience; public Resume2(String name){ this.name=name; workExperience=new WorkExperience2(); } public void setPersonInfo(String sex,String age){ this.sex=sex; this.age=age; } public void setWorkExperience(String workDate,String company){ workExperience.setWorkDate(workDate); workExperience.setCompany(company); } public void show(){ log.info("name="+name,",sex="+sex,",age="+age); log.info("company="+workExperience.getCompany(),"workDate="+workExperience.getWorkDate()); } @Override public Object clone() { Resume2 clone = null; try { clone = (Resume2)super.clone(); clone.workExperience=(WorkExperience2) workExperience.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } } 测试代码: @RunWith(SpringRunner.class) @SpringBootTest public class PrototypeApplicationTests { @Test public void clone1() { Resume resume=new Resume("测试1"); resume.setPersonInfo("男","25"); resume.setWorkExperience("2016-2017","台达"); Resume resume1=(Resume)resume.clone(); resume1.setWorkExperience("2017-2018","百度"); Resume resume2=(Resume)resume.clone(); resume2.setWorkExperience("2018-2019","阿里"); resume.show(); resume1.show(); resume2.show(); } @Test public void clone2() { Resume2 resume=new Resume2("测试1"); resume.setPersonInfo("男","25"); resume.setWorkExperience("2016-2017","台达"); Resume2 resume1=(Resume2)resume.clone(); resume1.setWorkExperience("2017-2018","百度"); Resume2 resume2=(Resume2)resume.clone(); resume2.setWorkExperience("2018-2019","阿里"); resume.show(); resume1.show(); resume2.show(); } } 运行结果如下: 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : name=测试1 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : company=阿里 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : name=测试1 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : company=阿里 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : name=测试1 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : company=阿里 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : name=测试1 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : company=阿里 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : name=测试1 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : company=阿里 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : name=测试1 2018-11-16 23:40:51.859 INFO 44132 --- \[ main\] com.shuyu.prototype.Resume : company=阿里 代码github地址:[https://github.com/iot-wangshuyu/designpatterns/tree/master/prototype][https_github.com_iot-wangshuyu_designpatterns_tree_master_prototype] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdfc2h1eXU_size_16_color_FFFFFF_t_70]: /images/20210901/31fef48decb64e759b4dfc4f2ccf6119.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdfc2h1eXU_size_16_color_FFFFFF_t_70 1]: /images/20210901/e8969293359f4e31acae996ca8baf70a.png [https_github.com_iot-wangshuyu_designpatterns_tree_master_prototype]: https://github.com/iot-wangshuyu/designpatterns/tree/master/prototype
相关 原型模式 public class Phone implements Cloneable { private String toPhoneNumber; 柔情只为你懂/ 2022年03月31日 08:16/ 0 赞/ 176 阅读
相关 原型模式 一. 原型模式简介 原型模式(Prototype Pattern)也是一种创建型模式,它关注的是大量相似对象的创建问题。我们经常会遇到这样的情况:在系统中要创建大量的 超、凢脫俗/ 2022年02月21日 12:16/ 0 赞/ 207 阅读
相关 原型模式 对象浅拷贝 实现Clonable接口,重写clone方法,jvm的本地方法实现拷贝 Object protected native Object clone() 女爷i/ 2021年12月12日 11:39/ 0 赞/ 242 阅读
相关 原型模式 原型模式(Prototype Pattern):通过原型实例指定创建对象的种类,并且通过克隆这些原型来创建新的对象。原型模式是一种创建型模式 完成原型模式一般需要3个角 落日映苍穹つ/ 2021年12月05日 01:03/ 0 赞/ 203 阅读
相关 原型模式 原型模式 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种 「爱情、让人受尽委屈。」/ 2021年09月29日 16:10/ 0 赞/ 297 阅读
相关 原型模式 原型模式:用原型实例指定创建指定对象的种类,并且通过复制这些原型创建新的对象,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价 骑猪看日落/ 2021年09月17日 01:08/ 0 赞/ 290 阅读
相关 原型模式 5.原型模式 ![70][] class Program { static void Main(string[] arg 痛定思痛。/ 2021年09月16日 23:52/ 0 赞/ 324 阅读
相关 原型模式 原型模式 定义 在软件系统中,有时需要多次创建某一类型的对象,为了简化创建过程,可以只创建一个对象,然后通过对象克隆的方式复制出多个相同的对象,这就是原型设计模 野性酷女/ 2021年07月24日 20:41/ 0 赞/ 460 阅读
相关 原型模式 型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了... 小灰灰/ 2020年06月13日 05:37/ 0 赞/ 710 阅读
还没有评论,来说两句吧...