原型模式

原型模式

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

​ 简单来说,就是通过clone()方法,实例化一个类;

使用场景:

  • 一个类如果需要很多对象的时候,使用原型对象直接clone就可以;
  • 一个对象的初始化需要很多其他对象的数据准备或其他资源的繁琐计算时,使用原型模式;
  • 需要一个对象的大量公共信息,少量字段进行个性化设置的时候,也可以使用原型模式;

具体使用:

  • 原型模式(Prototype)的实现:

    1、实现 Cloneable接口;

    2、重写clone(Object)的方法;

浅拷贝:clone出的第二个对象,这个对象中的引用将会继续引用第一个对象的引用;

image-20211202191350578

具体实现:

  • Prototype类:
/*一个原型类:
*   第一步:实现Cloneable接口
*   第二步:重写  Object clone() 方法
* */

public class Pttype implements Cloneable {
    private String name;
    private Date date;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public Pttype() {
    }

    public Pttype(String name,Date date) {
        this.name = name;
        this.date = date;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "Pttype{" +
                "name='" + name + '\'' +
                ", date=" + date +
                '}';
    }
}
  • 测试类:
//实现原型类: 浅拷贝模式
public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Date date = new Date();
        Pttype p1 = new Pttype("vxzx",date);
        System.out.println("输出p1==>" + p1);
        System.out.println("输出p1的hashCode==>" + p1.hashCode());

        Pttype p2 = (Pttype) p1.clone();
        System.out.println("输出p2==>" + p2);
        System.out.println("输出p2的hashCode==>" + p2.hashCode());

        System.out.println("==================================");
        //两个对象都引用同一个date
        date.setTime(121212);
        System.out.println("输出p1==>" + p1);
        System.out.println("输出p2==>" + p2);
    }
}

深拷贝:clone出的第二个对象,这个对象中的引用将会有自己的一个引用,而不会引用第一个对象的引用;

只需要在Prototype中把引用对象也clone()一份就可以解决浅拷贝的问题;

image-20211202191651827

具体实现:

  • Prototype类:
/*一个原型类:
*   第一步:实现Cloneable接口
*   第二步:重写  Object clone() 方法
* */
public class Pttype implements Cloneable {
    private String name;
    private Date date;

    //实现:clone的深拷贝
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Pttype clone = (Pttype) super.clone();

        //将date对象也clone,最后每clone一次都会生成一个对应的date对象
        this.date = new Date();

        return clone;
    }

    public Pttype() {
    }

    public Pttype(String name,Date date) {
        this.name = name;
        this.date = date;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "Pttype{" +
                "name='" + name + '\'' +
                ", date=" + date +
                '}';
    }
}
  • 测试类:
//实现原型类: 深拷贝模式
public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Date date = new Date();
        Pttype p1 = new Pttype("vxzx",date);
        System.out.println("输出p1==>" + p1);
        System.out.println("输出p1的hashCode==>" + p1.hashCode());

        Pttype p2 = (Pttype) p1.clone();
        System.out.println("输出p2==>" + p2);
        System.out.println("输出p2的hashCode==>" + p2.hashCode());

        System.out.println("==================================");
        //一个对象都有一个自己的date
        date.setTime(121212);
        System.out.println("输出p1==>" + p1);
        System.out.println("输出p2==>" + p2);
    }
}
posted @ 2021-12-03 00:00  VXZX  阅读(87)  评论(0)    收藏  举报