原型模式

1 基本概念

1、克隆的步骤

  1. 实现一个接口:Cloneable。
  2. 重写一个方法:clone()。

2 代码

1、案例1:浅克隆

  • Video

    package prototype.demo01;
    
    import java.util.Date;
    
    public class Video implements Cloneable {
        private String name;
        private Date createTime;
    
        public Video() {
        }
    
        public Video(String name, Date createTime) {
            this.name = name;
            this.createTime = createTime;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Date getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
    
        @Override
        public String toString() {
            return "Video{" +
                    "name='" + name + '\'' +
                    ", createTime=" + createTime +
                    '}';
        }
    
        // 浅克隆
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
  • Bilibili

    package prototype.demo01;
    
    import org.junit.Test;
    
    import java.util.Date;
    
    /**
     * 客户端
     */
    public class Bilibili {
       /**
        * 浅克隆
        */
       @Test
       public void test() throws CloneNotSupportedException {
          // 原型对象:v1
          Date date = new Date();
          Video v1 = new Video("my video", date);
          System.out.println("v1:" + v1);
          System.out.println("v1.hashCode():" + v1.hashCode());
          // 克隆对象:v2
          Video v2 = (Video) v1.clone();
          System.out.println("v2:" + v2);
          System.out.println("v2.hashCode():" + v2.hashCode());
          System.out.println(v1.getCreateTime() == v2.getCreateTime());   // true
       }
    }

2、案例2:深克隆

  • Video

    package prototype.demo02;
    
    import java.util.Date;
    
    public class Video implements Cloneable {
        private String name;
        private Date createTime;
    
        public Video() {
        }
    
        public Video(String name, Date createTime) {
            this.name = name;
            this.createTime = createTime;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Date getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
    
        @Override
        public String toString() {
            return "Video{" +
                    "name='" + name + '\'' +
                    ", createTime=" + createTime +
                    '}';
        }
    
        // 实现深克隆
        @Override
        protected Object clone() throws CloneNotSupportedException {
            Object obj = super.clone();
            Video v = (Video) obj;
            // 将这个对象的属性也进行克隆
            v.createTime = (Date) this.createTime.clone();
            return obj;
        }
    }
  • Bilibili

    package prototype.demo02;
    
    import org.junit.Test;
    
    import java.util.Date;
    
    /**
     * 客户端
     */
    public class Bilibili {
       /**
        * 深克隆
        */
       @Test
       public void test() throws CloneNotSupportedException {
          // 原型对象:v1
          Date date = new Date();
          Video v1 = new Video("my video", date);
          System.out.println("v1:" + v1);
          System.out.println("v1.hashCode():" + v1.hashCode());
          // 克隆对象:v2
          Video v2 = (Video) v1.clone();
          System.out.println("v2:" + v2);
          System.out.println("v2.hashCode():" + v2.hashCode());
          System.out.println(v1.getCreateTime() == v2.getCreateTime());   // false
       }
    }
全部评论

相关推荐

大族激光智能控制科技 算法工程师 12K+加班费2.5K,十五薪,一年调一次薪,区间0.1-0.3,写专利,论文一份一万,会系统化培养应届生
点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务