zoukankan      html  css  js  c++  java
  • 设计模式之原型设计模式

    原型设计模式

    原型设计模式的定义是原型实例指定对象的类型,通过拷贝这些原型来创建新的对象

    原型设计的例子

    以<<大话设计模式>>例子为例子:我们求职投简历,经历这一栏在投不同的公司需要修改,我们不要再去创建个人信息、工作经历,
    通过拷贝来减少简历中对象的创建。

    简历父类

    package com.learn.java.javabase.designpattern.prototype;
    
    import lombok.Data;
    
    @Data
    public class Resume implements Cloneable {
        private String id;
    
        @Override
        public Resume clone() throws CloneNotSupportedException {
            Resume resume = null;
            resume = (Resume) super.clone();
            return resume;
        }
    }
    
    

    简历的实现类

    package com.learn.java.javabase.designpattern.prototype;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.extern.slf4j.Slf4j;
    
    @Data
    @AllArgsConstructor
    @Slf4j
    public class CloneResume01 extends Resume {
        private String name;
        private String age;
        private String year;
        private String workInfo;
        private Remark remark;
    
        //    public CloneResume01(Remark remark)
    //    {
    //        this.remark =remark.clone();
    //    }
        public CloneResume01(String age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public CloneResume01(String age, String name, Remark remark) {
            this.age = age;
            this.name = name;
            this.remark = remark;
        }
    
        public void setWorkInfo(String year, String workinfo) {
            this.year = year;
            this.workInfo = workinfo;
        }
    
        public void display() {
            log.info("name = {} ,age = {} , in year {}  {},remark ={}", name, age, year, workInfo, remark.toString());
        }
    
        @Override
        public CloneResume01 clone() {
            CloneResume01 cloneResume01 =null;
            try {
                cloneResume01 = (CloneResume01) super.clone();
                cloneResume01.setRemark(this.getRemark().clone());
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return cloneResume01;
        }
    }
    

    简历中的备注类Remark

    备注类作为简历的一个属性,因为浅复制只能复制String等基础数据类型的值,但对于其他的引用类型并没有拷贝值,只传递对象的引用地址
    因此重写Remark类的clone方法,进行深度复制,并在简历类中调用clone方法完成深度复制。

    package com.learn.java.javabase.designpattern.prototype;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    
    @Data
    @AllArgsConstructor
    public class Remark implements Cloneable {
        private String remarkValue;
    
        @Override
        public Remark clone() {
            Remark remark = null;
            try {
                remark = (Remark) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return remark;
        }
        @Override
        public String toString(){
            return remarkValue;
        }
    
    }
    
    

    测试类

    package com.learn.java.javabase.designpattern.prototype;
    
    public class TestProtoType {
        public static void main(String[] args) {
            CloneResume01 jackResume=new CloneResume01("fang","28","2017-2019","comp1"
                    ,new Remark("first job"));
            CloneResume01 jackResume02=jackResume.clone();
            //Remark没有实现clone方法,下面这句话会因为是复制新的Remark对象,所以打印的Remark是不一样的
            //jackResume02.setRemark(new Remark("second job"));
            //浅复制和深复制,Remark和Resume实现类两个clone方法没有修改,会因为浅复制吗,导致拷贝的实例的值与原型的值是一样的
            jackResume02.getRemark().setRemarkValue("second job");
            jackResume02.setWorkInfo("2020-now","comp2");
            jackResume.display();
            jackResume02.display();
        }
    }
    
    

    运行结果

    22:44:53.007 [main] INFO com.learn.java.javabase.designpattern.prototype.CloneResume01 - name = fang ,age = 28 , in year 2017-2019  comp1,remark =first job
    22:44:53.010 [main] INFO com.learn.java.javabase.designpattern.prototype.CloneResume01 - name = fang ,age = 28 , in year 2020-now  comp2,remark =second job
    
  • 相关阅读:
    会议开饭
    计算时间差(c#和sqlServer)
    sqlserver 新增表字段
    javascript刷新父页面的各种方法汇总
    java 从List中随机取出一个元素
    解决Appium 抓取toast(java篇)
    appium java-client 5.0以后移除了swipe方法,也就是无法使用driver.swipe()了
    appium怎么按下系统按键?如按下返回键、home键等等
    Android 常用 adb 命令总结
    appium Capabilities的各个标签
  • 原文地址:https://www.cnblogs.com/JuncaiF/p/12247121.html
Copyright © 2011-2022 走看看