原型模式

骑猪看日落 2021-09-17 01:08 394阅读 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

潜复制代码:

  1. /**
  2. * @author Shuyu.Wang
  3. * @package:com.shuyu.prototype
  4. * @description:
  5. * @date 2018-11-16 23:11
  6. **/
  7. @Data
  8. public class WorkExperience {
  9. private String workDate;
  10. private String company;
  11. }
  12. /**
  13. * @author Shuyu.Wang
  14. * @package:com.shuyu.prototype
  15. * @description:原型类,实现Cloneable,重写clone(),实现浅复制
  16. * @date 2018-11-16 23:05
  17. **/
  18. @Slf4j
  19. public class Resume implements Cloneable{
  20. private String name;
  21. private String sex;
  22. private String age;
  23. private WorkExperience workExperience;
  24. public Resume(String name){
  25. this.name=name;
  26. workExperience=new WorkExperience();
  27. }
  28. public void setPersonInfo(String sex,String age){
  29. this.sex=sex;
  30. this.age=age;
  31. }
  32. public void setWorkExperience(String workDate,String company){
  33. workExperience.setWorkDate(workDate);
  34. workExperience.setCompany(company);
  35. }
  36. public void show(){
  37. log.info("name="+name,",sex="+sex,",age="+age);
  38. log.info("company="+workExperience.getCompany(),"workDate="+workExperience.getWorkDate());
  39. }
  40. @Override
  41. public Object clone() {
  42. Object clone = null;
  43. try {
  44. clone = super.clone();
  45. } catch (CloneNotSupportedException e) {
  46. e.printStackTrace();
  47. }
  48. return clone;
  49. }
  50. }

深复制代码:

  1. /**
  2. * @author Shuyu.Wang
  3. * @package:com.shuyu.prototype
  4. * @description:
  5. * @date 2018-11-16 23:11
  6. **/
  7. @Data
  8. public class WorkExperience2 implements Cloneable{
  9. private String workDate;
  10. private String company;
  11. @Override
  12. public Object clone() {
  13. Object clone = null;
  14. try {
  15. clone = super.clone();
  16. } catch (CloneNotSupportedException e) {
  17. e.printStackTrace();
  18. }
  19. return clone;
  20. }
  21. }
  22. /**
  23. * @author Shuyu.Wang
  24. * @package:com.shuyu.prototype
  25. * @description:原型类,实现Cloneable,重写clone(),实现深复制
  26. * @date 2018-11-16 23:05
  27. **/
  28. @Slf4j
  29. public class Resume2 implements Cloneable{
  30. private String name;
  31. private String sex;
  32. private String age;
  33. private WorkExperience2 workExperience;
  34. public Resume2(String name){
  35. this.name=name;
  36. workExperience=new WorkExperience2();
  37. }
  38. public void setPersonInfo(String sex,String age){
  39. this.sex=sex;
  40. this.age=age;
  41. }
  42. public void setWorkExperience(String workDate,String company){
  43. workExperience.setWorkDate(workDate);
  44. workExperience.setCompany(company);
  45. }
  46. public void show(){
  47. log.info("name="+name,",sex="+sex,",age="+age);
  48. log.info("company="+workExperience.getCompany(),"workDate="+workExperience.getWorkDate());
  49. }
  50. @Override
  51. public Object clone() {
  52. Resume2 clone = null;
  53. try {
  54. clone = (Resume2)super.clone();
  55. clone.workExperience=(WorkExperience2) workExperience.clone();
  56. } catch (CloneNotSupportedException e) {
  57. e.printStackTrace();
  58. }
  59. return clone;
  60. }
  61. }

测试代码:

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class PrototypeApplicationTests {
  4. @Test
  5. public void clone1() {
  6. Resume resume=new Resume("测试1");
  7. resume.setPersonInfo("男","25");
  8. resume.setWorkExperience("2016-2017","台达");
  9. Resume resume1=(Resume)resume.clone();
  10. resume1.setWorkExperience("2017-2018","百度");
  11. Resume resume2=(Resume)resume.clone();
  12. resume2.setWorkExperience("2018-2019","阿里");
  13. resume.show();
  14. resume1.show();
  15. resume2.show();
  16. }
  17. @Test
  18. public void clone2() {
  19. Resume2 resume=new Resume2("测试1");
  20. resume.setPersonInfo("男","25");
  21. resume.setWorkExperience("2016-2017","台达");
  22. Resume2 resume1=(Resume2)resume.clone();
  23. resume1.setWorkExperience("2017-2018","百度");
  24. Resume2 resume2=(Resume2)resume.clone();
  25. resume2.setWorkExperience("2018-2019","阿里");
  26. resume.show();
  27. resume1.show();
  28. resume2.show();
  29. }
  30. }

运行结果如下:

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

发表评论

表情:
评论列表 (有 0 条评论,394人围观)

还没有评论,来说两句吧...

相关阅读

    相关 原型模式

    一. 原型模式简介    原型模式(Prototype Pattern)也是一种创建型模式,它关注的是大量相似对象的创建问题。我们经常会遇到这样的情况:在系统中要创建大量的

    相关 原型模式

    对象浅拷贝 实现Clonable接口,重写clone方法,jvm的本地方法实现拷贝 Object protected native Object clone()

    相关 原型模式

    原型模式(Prototype Pattern):通过原型实例指定创建对象的种类,并且通过克隆这些原型来创建新的对象。原型模式是一种创建型模式   完成原型模式一般需要3个角

    相关 原型模式

    原型模式:用原型实例指定创建指定对象的种类,并且通过复制这些原型创建新的对象,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价

    相关 原型模式

    原型模式 定义 在软件系统中,有时需要多次创建某一类型的对象,为了简化创建过程,可以只创建一个对象,然后通过对象克隆的方式复制出多个相同的对象,这就是原型设计模

    相关 原型模式

    型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了...