原型模式

spring bean就用了:原型模式

如果某个对象的创建过程太复杂了,如果下次还要要这个对象,就不用new了,用我们的原型模式(浅拷贝或者深拷贝

原型就是Video类

客户端Bilili为要克隆Video的类

原型类:
1.要实现一个接口Cloneable
2.要重写一个方法clone()

1.浅拷贝

就是复制出来的对象指向原来对象那里
原型模式

package com.yuan;

import java.util.Date;

/**
 * @author QLBF 原型模式
 * @version 1.0
 * @date 2021/5/25 21:08
 */

/*1.原型要实现一个接口Cloneable
        2.要重写一个方法clone()*/
class Video implements Cloneable{
private String name;
private Date createTime;

//这演示浅拷贝
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public Video() {
    }

    public Video(String name, Date createTime) {
        this.name = name;
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "Video{" +
                "name='" + name + '\'' +
                ", 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;
    }
}

//客户端Bilili:克隆
public class Bilili {
    public static void main(String[] args) throws CloneNotSupportedException {
        //原型对象V1
        Date date=new Date();
        Video v1=new Video("狂神说java",date);
        //v2克隆v1
        Video v2 = (Video) v1.clone();
        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v2);

        date.setTime(27128129);
        System.out.println("======================");
        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v2);

    }
}

浅拷贝:把v1的值改了,v2会跟着变
原型模式

2.深拷贝(深克隆)

其实实现深克隆~还可以用序列化, 反序列化,在这里我们只演示改clone
原型模式
深拷贝只要在原型类的clone改一下就好,Bilil不用变:

package com.yuan;

import java.util.Date;

/**
 * @author QLBF 原型模式
 * @version 1.0
 * @date 2021/5/25 21:08
 */

/*1.原型要实现一个接口Cloneable
        2.要重写一个方法clone()*/
class Video implements Cloneable{
private String name;
private Date createTime;

//这演示深拷贝
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();
        //实现深克隆
        Video v = (Video) obj;
        //将这个对象的属性也进行克隆~,在这里我们只演示时间的深克隆,名字这属性没设
        v.createTime= (Date) this.createTime.clone();
        return v;
    }

    public Video() {
    }

    public Video(String name, Date createTime) {
        this.name = name;
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "Video{" +
                "name='" + name + '\'' +
                ", 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;
    }
}

//客户端Bilili:克隆
public class Bilili {
    public static void main(String[] args) throws CloneNotSupportedException {
        //原型对象V1
        Date date=new Date();
        Video v1=new Video("狂神说java",date);
        //v2克隆v1
        Video v2 = (Video) v1.clone();
        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v2);

        date.setTime(27128129);
        System.out.println("======================");
        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v2);

    }
}

现在改v1,v2不会跟着变了,因为深克隆的对象指向另一块空间的
原型模式

上一篇:小白日记--返回数据的三种常用封装形式


下一篇:MeterSphere(5):使用Beanshell后置脚本获取Json中的数据