设计模式(四) | 简历复印与原型模型不得不说的一些事

原型模型

  • 原型模式其实就是从一个对象基础上再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
  • 原型模型可以大大提高效率。一般在初始化的信息不发生变化的情况下,克隆是最好的办法,即隐藏了创建对象的细节,又对性能有大大的提升。
  • 看代码就知道怎么回事了。以书写简历为例:
    1. public class Resume implements Cloneable{
    2. String name;
    3. String sex;
    4. String age;
    5. String timearea;
    6. String company;
    7. public Resume(String name) {
    8. super();
    9. this.name = name;
    10. }
    11. public Resume() {
    12. super();
    13. }
    14. //设置个人信息
    15. public void setPersonInfo(String sex,String age){
    16. this.sex = sex;
    17. this.age = age;
    18. }
    19. //设置个人信息
    20. public void setWorkExperience(String timearea,String company){
    21. this.timearea = timearea;
    22. this.company = company;
    23. }
    24. @Override
    25. public String toString() {
    26. return name + " " + sex + " " + age + "\n工作经历:" + timearea + " "
    27. + company;
    28. }
    29. public Object Clone() throws Exception{
    30. return this.clone();
    31. }
    32. }
    33. public class Test {
    34. public static void main(String[] args) throws Exception {
    35. Resume a = new Resume("大鸟");
    36. a.setPersonInfo("男", "20岁");
    37. a.setWorkExperience("2013-2017", "东北林业大学");
    38. Resume b = (Resume)a.Clone();
    39. b.setWorkExperience("2017-2022", "哈尔滨工业大学");
    40. Resume c = (Resume)a.Clone();
    41. c.setWorkExperience("2022-2030", "google");
    42. System.out.println(a);
    43. System.out.println(b);
    44. System.out.println(c);
    45. }
    46. }
  • 输出结果:
    1. 大鸟 20岁
    2. 工作经历:2013-2017 东北林业大学
    3. 大鸟 20岁
    4. 工作经历:2017-2020 哈尔滨工业大学
    5. 大鸟 20岁
    6. 工作经历:2020-2022 google
  • 注:上述代码是原型模型的浅复制,只能复制值类型的数据,对于引用类型的对象不能复制。
  • 如果将工作经历也单独做一个类,然后在resume类中应用工作经历,就会输出3条一模一样的结果。
  • 浅复制被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都任指向原来的对象。
  • 将工作经历也单独做一个类的代码:
    1. public class WorkExperience {
    2. String timearea;
    3. String company;
    4. public String getTimearea() {
    5. return timearea;
    6. }
    7. public void setTimearea(String timearea) {
    8. this.timearea = timearea;
    9. }
    10. public String getCompany() {
    11. return company;
    12. }
    13. public void setCompany(String company) {
    14. this.company = company;
    15. }
    16. @Override
    17. public String toString() {
    18. return "\n工作经历" + timearea + " " + company;
    19. }
    20. }
    21. public class Resume implements Cloneable{
    22. String name;
    23. String sex;
    24. String age;
    25. WorkExperience work;
    26. public Resume(String name) {
    27. super();
    28. this.name = name;
    29. work = new WorkExperience();
    30. }
    31. public Resume() {
    32. super();
    33. }
    34. //设置个人信息
    35. public void setPersonInfo(String sex,String age){
    36. this.sex = sex;
    37. this.age = age;
    38. }
    39. public void setWorkExperience(String timearea,String company){
    40. work.timearea = timearea;
    41. work.company = company;
    42. }
    43. @Override
    44. public String toString() {
    45. return name + " " + sex + " " + age + work ;
    46. }
    47. public Object Clone() throws Exception{
    48. return this.clone();
    49. }
    50. }
  • 输出结果
    1. 大鸟 20岁
    2. 工作经历:2020-2022 google
    3. 大鸟 20岁
    4. 工作经历:2020-2022 google
    5. 大鸟 20岁
    6. 工作经历:2020-2022 google
  • 深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
  • 二层深复制的代码:
    1. public class WorkExperience implements Cloneable{
    2. String timearea;
    3. String company;
    4. public String getTimearea() {
    5. return timearea;
    6. }
    7. public void setTimearea(String timearea) {
    8. this.timearea = timearea;
    9. }
    10. public String getCompany() {
    11. return company;
    12. }
    13. public void setCompany(String company) {
    14. this.company = company;
    15. }
    16. @Override
    17. public String toString() {
    18. return "\n工作经历" + timearea + " " + company;
    19. }
    20. public Object Clone() throws Exception{
    21. return this.clone();
    22. }
    23. }
    24. public class Resume implements Cloneable{
    25. String name;
    26. String sex;
    27. String age;
    28. WorkExperience work;
    29. public Resume(String name) {
    30. super();
    31. this.name = name;
    32. work = new WorkExperience();
    33. }
    34. public Resume() {
    35. super();
    36. }
    37. private Resume(WorkExperience work) throws Exception {
    38. super();
    39. this.work = (WorkExperience)work.Clone();
    40. }
    41. //设置个人信息
    42. public void setPersonInfo(String sex,String age){
    43. this.sex = sex;
    44. this.age = age;
    45. }
    46. public void setWorkExperience(String timearea,String company){
    47. work.timearea = timearea;
    48. work.company = company;
    49. }
    50. @Override
    51. public String toString() {
    52. return name + " " + sex + " " + age + work ;
    53. }
    54. public Object Clone() throws Exception{
    55. Resume obj = new Resume(this.work);
    56. obj.name = this.name;
    57. obj.age = this.age;
    58. obj.sex = this.sex;
    59. return obj;
    60. }
    61. }
  • 输出结果:
    1. 大鸟 29岁
    2. 工作经历2013-2017 东北林业大学
    3. 大鸟 29岁
    4. 工作经历2017-2022 哈尔滨工业大学
    5. 大鸟 29岁
    6. 工作经历2020-2030 google
  • 代码改动的地方:
    • 让WorkExperience类也实现了Cloneable的接口,并增加了clone()方法。
    • 在resume类中新增了一个私有的构造方法。
    • 修改了resume的clone()的方法。

往期回顾

设计模式(一) | 啥是工厂模式和策略模式?

设计模式(二) | 装饰模式---穿什么有这么重要?

设计模式(三) | 为别人做嫁衣---代理模式

原文发布于微信公众号 - 轮子工厂(Programmer-ing)

原文发表时间:2017-09-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python读书笔记

《算法图解》NOTE 4 快速排序法1.递归与分治法2.快速排序法的实现3.快速排序法的时间复杂度(用渐近表示法表示)

22160
来自专栏LeetCode

LeetCode <dp>64. Minimum Path Sum

Given a m x n grid filled with non-negative numbers, find a path from top left t...

17100
来自专栏cs

递归算法

据说凡是可以循环的步骤,都可以递归表示出来。 递归的关键有二点: 1.0 递归公式,即递推式。 2.0 递归出口。 ---- 递归求数组的和 package...

40050
来自专栏CDA数据分析师

技能 | 利用SAS进行数据清洗技术——缺失值查询

数据清洗技术是统计分析之前必做的一步,而且也是非常麻烦的一步,有时甚至花费的时间比统计分析都长。所以没有一定的技巧,这将是个非常烦人的工作。本篇文章介绍如何利用...

344100
来自专栏专知

【专知-关关的刷题日记15】Leetcode 27. Remove Element 方法1、2、3

题目 Given an array and a value, remove all instances of that value in place and r...

35570
来自专栏java一日一条

5 分钟搞定 Java Comparable 接口

还有一个不错的视频(https://marcus-biel.com/java-comparable-interface-video-tutorial/)。

11750
来自专栏专知

​关关的刷题日记100 – Leetcode 442. Find All Duplicates in an Array

关关的刷题日记100 – Leetcode 442. Find All Duplicates in an Array 题目 Given an array of ...

36360
来自专栏落影的专栏

程序员进阶之算法练习(十七)

前言 正文6道题目来自leetcode––为求职为生的编程网站,目的是工作闲暇之时锤炼代码功底。 如何从这篇文章受益? 先看题目大意,对照Example的样...

45790
来自专栏数据结构与算法

等差数列与等比数列

数列中的每一项都和它的序号有关,排在第一位的数称为这个数列的第一项(通常也叫做首项)

10020
来自专栏我是攻城师

为什么快速排序算法效率比较高?

快速排序算法是非常高效的一个排序算法,在众多的排序算法里面其无论在时间复杂度还是空间复杂度都是比较低的。因此作为一个程序员,我们很有必要学习和理解快排的原理。

2.9K30

扫码关注云+社区

领取腾讯云代金券