6、大话设计模式之原型模式

本文详细介绍了Java中的原型模式,包括Cloneable接口的使用、深拷贝和浅拷贝的区别,以及如何通过序列化实现深克隆。通过案例分析,展示了原型模式在创建对象时的优势,避免了直接new操作。
摘要由CSDN通过智能技术生成

作用:就是不用创建对象,直接克隆一个对象,不用去实例化去new 对象,实际上理解下面的知识,就已经知道原型模式了,就是如何使用克隆

1、前提知识

1、Cloneable接口

在Java中,如果一个类想要支持克隆,就必须实现Cloneable接口。Cloneable接口是一个标记接口,没有任何方法或常量,只是告诉编译器该类可以被克隆。如果一个类没有实现Cloneable接口,那么它的clone()方法就会在编译时被标记为“未定义”,无法使用

实现Cloneable接口非常简单,只需要在类的声明中加上“implements Cloneable”即可。例如:

public class MyClass implements Cloneable {
    // 类的成员变量和方法声明
}

 需要注意的是,实现Cloneable接口只是告诉编译器该类可以被克隆,但并不会自动为该类生成clone()方法。因此,如果要使用clone()方法,还需要在类中重写Object类中的clone()方法。

1、clone()方法的使用

在实现了Cloneable接口的类中,可以通过重写Object类中的clone()方法来实现对象的克隆。clone()方法是一个protected方法,它返回一个该类的克隆对象。在实现clone()方法时,需要注意以下几点:

    1、clone()方法必须是public的,否则无法使用。

    2、clone()方法的返回值类型必须是该类的类型或其子类的类型。

    3、clone()方法需要调用super.clone()方法,以便进行对象的浅克隆。

    4、如果需要进行对象的深克隆,需要在clone()方法中进行相应的操作。

Cloneable接口是Object类(所有类的父类)提供的一个标记接口,里面没有定义任何内容。主要是和Object的clone方法配合使用。如果没有实现这个接口,而调用了clone方法,会抛出CloneNotSupportException
其中克隆分成浅克隆和深克隆
2、使用clone()方法的注意事项

在使用clone()方法时,需要注意以下几点:

    clone()方法是一个浅拷贝方法,它只会复制对象本身,而不会复制对象所引用的其他对象。如果需要进行对象的深拷贝,需要在clone()方法中进行相应的操作。

    在实现clone()方法时,需要注意避免出现克隆对象和原对象共享引用的情况。如果出现了这种情况,可能会导致不可预期的错误。

    在使用clone()方法时,需要注意对克隆对象进行适当的初始化。如果克隆对象的成员变量没有被正确地初始化,可能会导致不可预期的错误。

2、深拷贝和浅拷贝的区别

什么是浅拷贝?

Java浅拷贝是指只复制对象的引用,而不是创建一个新的对象。这意味着,修改新对象将会影响原始对象。浅拷贝通常是通过Object类的clone()方法来实现的,它只对八种基本数据类型和对象引用类型生效,对于其他数据类型均无法实现浅拷贝。

什么是深拷贝?

相对于浅拷贝,深拷贝会创建一个新的对象,并将原始对象的所有属性也复制到新创建的对象中。这意味着,修改新对象不会影响到原始对象。深拷贝通常使用Java序列化API实现,但也可以通过流式处理、ObjectInputStream/ObjectOutputStream来实现。

总结:

浅拷贝:复制对象的引用,不创建新对象,修改拷贝的对象,会影响原来旧的对象

深拷贝:创建一个新的对象,并将原来的对象的所有属性都复制到新对象,并且修改新对象不影响旧对象的内容

3、浅克隆

首先user实现Cloneable接口(getter等就省略了):

public class User implements Cloneable{
    private String name;
    private Integer age;

    //getter等方法略


    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }


    @Override
    public Object clone(){
        User user=null;
        try {
            user = (User)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

越来越没意思

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值