• 设计模式——原型模式


    原型模式是什么?

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

    原型模式解决什么问题?

    当前有简历类

    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

  • 相关阅读:
    Redis 布隆过滤器的相关命令的使用
    nginx相关解析
    [译]使用Python和Dash 创建一个仪表盘(上)
    AcWing.505 火柴排队(离散化&逆序对)
    嵌入式编程规范及注意事项
    pycharm2022.2 远程连接服务器调试代码
    【NLP】使用递归神经网络对序列数据进行建模 (Pytorch)
    [论文阅读]PV-RCNN++
    easyAI笔记——深度学习
    【C++ 算法进阶】算法提升七
  • 原文地址:https://blog.csdn.net/qq_35258036/article/details/132908189