• 设计模式——原型模式


    原型模式是什么?

    用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象

    原型模式解决什么问题?

    当前有简历类

    public class Resume {
        private String name;
        private String sex;
        private String age;
        private String timeArea;
        private String company;
    
        public Resume(String name) {
            this.name = name;
        }
    
        public void setPersonInfo(String sex, String age) {
            this.sex = sex;
            this.age = age;
        }
    
        public void setWorkExperience(String timeArea, String company) {
            this.timeArea = timeArea;
            this.company = company;
        }
    
        public void display() {
            System.out.println(name + " " + sex + " " + age);
            System.out.println("工作经历 " + timeArea + " " + company);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    当要生成3份相同的简历时,只能将代码复制3次

    Resume resume1 = new Resume("A");
    resume1.setPersonInfo("男", "23");
    resume1.setWorkExperience("1998-2000", "A公司");
    
    Resume resume2 = new Resume("A");
    resume2.setPersonInfo("男", "23");
    resume2.setWorkExperience("1998-2000", "A公司");
    
    Resume resume3 = new Resume("A");
    resume3.setPersonInfo("男", "23");
    resume3.setWorkExperience("1998-2000", "A公司");
    
    resume1.display();
    resume2.display();
    resume3.display();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    原型模式实现

    原型模式从一个对象再创建另一个对象,且不需要知道任何创建细节,Java提供了Cloneable

    public class Resume implements Cloneable {
        private String name;
        private String sex;
        private String age;
        private String timeArea;
        private String company;
    
        public Resume(String name) {
            this.name = name;
        }
    
        public void setPersonInfo(String sex, String age) {
            this.sex = sex;
            this.age = age;
        }
    
        public void setWorkExperience(String timeArea, String company) {
            this.timeArea = timeArea;
            this.company = company;
        }
    
        public void display() {
            System.out.println(name + " " + sex + " " + age);
            System.out.println("工作经历 " + timeArea + " " + company);
        }
    
        @NonNull
        @Override
        protected Resume clone() {
            Resume object = null;
            try {
                object = (Resume) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return object;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    构造函数执行时间很长时,调用Clone()初始化可以提高性能

    Resume resume1 = new Resume("A");
    resume1.setPersonInfo("男", "23");
    resume1.setWorkExperience("1998-2000", "A公司");
    
    Resume resume2 = resume1.clone();
    resume2.setWorkExperience("2000-2003", "B公司");
    
    Resume resume3 = resume2.clone();
    resume3.setPersonInfo("男", "24");
    
    resume1.display();
    resume2.display();
    resume3.display();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    浅拷贝和深拷贝

    详见Java中级——Object和Objects

  • 相关阅读:
    如何避免手动修改文件名,批量重命名文件的方法
    Pytorch在训练时冻结某些层使其不参与反向传播
    本地虚拟机centos7通过docker安装主从mysql5.7.21
    代码随想录第35天 | ● 01背包问题,你该了解这些! ● 01背包问题—— 滚动数组 ● 416. 分割等和子集
    用工业路由器就能实现的下管廊远程监控无线解决方案
    输入输出管理:设备独立性软件
    Java中split方法简介
    机器视觉 光源
    牛津大学海外学习:14天的知识与文化之旅
    以邻接矩阵形式创建图(C语言)
  • 原文地址:https://blog.csdn.net/qq_35258036/article/details/132908189