• 原型模式


    一、定义:

    ​ 原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    二、特点:

    ​ 一般在初始化信息不发生变化的情况下,克隆是最好的方法。这既隐藏了对象创建的细节,又对性能是大大的提高。可以不用重新初始化对象,而是动态地获得对象运行时的状态。

    浅复制:只复制它本身和其中包含的值的类型的成员变量,而引用类型的成员变量并没有被复制。所有的对其他对象的引用仍然指向原来的对象。

    深复制:复制它本身和其中包含的所有成员变量。

    三、示例代码:

    ​ 浅复制:

    //原型类,简历
    public class Resume implements Cloneable {
        private String name;
        private String sex;
        private String age;
        private WorkExperience work;
    
        public void setPersonalInfo(String sex, String age) {
            this.sex = sex;
            this.age = age;
        }
    
        public Resume(String name) {
            this.name = name;
            work = new WorkExperience();
        }
    
        public void setWork(String workDate, String workCompany) {
            work.setWorkCompany(workCompany);
            work.setWorkDate(workDate);
        }
    
        public void display() {
            System.out.println("name:"+name+" age:"+age+" sex:"+sex);
            System.out.println("workExperience:"+work.getWorkCompany()+" "+work.getWorkDate());
        }
        
        public Resume clone(){
            Object object=null;
            try {
              object = super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
    
            }
            return (Resume) object;
        }
    }
    
    
    //引用对象,工作经历类
    public class WorkExperience {
        private String workDate;
        private String workCompany;
    
        public String getWorkDate() {
            return workDate;
        }
    
        public void setWorkDate(String workDate) {
            this.workDate = workDate;
        }
    
        public String getWorkCompany() {
            return workCompany;
        }
    
        public void setWorkCompany(String workCompany) {
            this.workCompany = workCompany;
        }
    }
    
    
    //客户端类
    public class Client {
        public static void main(String[] args) {
            Resume resume = new Resume("小鹏");
            resume.setPersonalInfo("male", "20");
            resume.setWork("2017-2018", "tencent");
    
            Resume resume1 = resume.clone();
            Resume resume2 = resume.clone();
            //一个对象的引用类型发生变化,三个对象都发生了变化。值类型不变
            resume1.setWork("23", "2334");
            resume1.setPersonalInfo("23", "2334");
    
    
            resume.display();
            resume1.display();
            resume2.display();
        }
    }
    
    

    深复制:

    //原型类
    public class Resume implements Cloneable {
        private String name;
        private String sex;
        private String age;
        private WorkExperience work;
    
        public void setPersonalInfo(String sex, String age) {
            this.sex = sex;
            this.age = age;
        }
    
        public Resume(String name) {
            this.name = name;
            work = new WorkExperience();
        }
    
        public void setWork(String workDate, String workCompany) {
            work.setWorkCompany(workCompany);
            work.setWorkDate(workDate);
        }
    
        public void display() {
            System.out.println("name:" + name + " age:" + age + " sex:" + sex);
            System.out.println("workExperience:" + work.getWorkCompany() + " " + work.getWorkDate());
        }
    
        public Resume clone() {
            Object object = null;
            try {
                object = super.clone();
                //引用类型和对象本身都需要克隆
                Resume resume = (Resume) object;
                resume.work = work.clone();
                return (Resume) object;
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    
    
    //工作经历类,引用类也需要实现cloneable接口
    public class WorkExperience implements Cloneable {
        private String workDate;
        private String workCompany;
    
        public String getWorkDate() {
            return workDate;
        }
    
        public void setWorkDate(String workDate) {
            this.workDate = workDate;
        }
    
        public String getWorkCompany() {
            return workCompany;
        }
    
        public void setWorkCompany(String workCompany) {
            this.workCompany = workCompany;
        }
        public WorkExperience clone(){
            Object  object=null;
            try {
                object=super.clone();
                return (WorkExperience) object;
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    
    
    //客户端
    public class Client {
        public static void main(String[] args) {
            Resume resume = new Resume("小鹏");
            resume.setPersonalInfo("male", "20");
            resume.setWork("2017-2018", "tencent");
    		//深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象
            Resume resume1 = resume.clone();
            Resume resume2 = resume.clone();
            resume1.setWork("23", "2334");
            resume1.setPersonalInfo("23", "2334");
    
    
            resume.display();
            resume1.display();
            resume2.display();
        }
    }
    
    
  • 相关阅读:
    解决jar包冲突
    postman使用记录
    get请求直接通过浏览器发请求传数组或者list到后台
    excel中ppmt/pmt/ipmt的计算方式
    unicode编码与解码
    spring参数拼装
    java内存模型(jmm)
    Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)
    星空雅梦
    星空雅梦
  • 原文地址:https://www.cnblogs.com/yfy-/p/11974405.html
Copyright © 2020-2023  润新知