二十三种设计模式(第四种)-----原型模式(Prototype)

本文详细介绍了设计模式中的原型模式,通过实例展示了如何实现对象的克隆,包括浅拷贝和深拷贝的区别。在深拷贝中,通过两种方式实现了对象的完全复制,避免了修改一个对象会影响到另一个对象的问题。此外,文章还提及了原型模式在Spring框架中的应用,特别是在创建bean时的作用。
摘要由CSDN通过智能技术生成

二十三种设计模式(第四种)-----原型模式(Prototype)

尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=11487053970269878470

  1. 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。
  2. 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道创建的细节
  3. 工作原理:通过将一个原型对象传给那个要发起创建的对象,这个要发起创建的对象通过请求原型对象拷贝它们自己来实施创建,即对象.clone()
  4. 形象理解:孙大圣拔出猴毛,变成其它孙大圣

克隆模式:实现Cloneable接口,重写clone方法。

类图

原型设计模式类图

代码

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Sheep implements Cloneable{

    private String name;

    private Integer age;

    private String color;

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

浅拷贝和深拷贝

浅拷贝
  1. 对于数据类型是基本数据类型或String类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象
  2. 对于引用数据类型的成员变量,比如成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是将该成员变量的应用值(内存地址)复制一份给新的的对象。因此实际上两个对象的该成员变量都指向同一个实例。这种情况下,一个对象修改该成员变量会影响到另一个成员变量的该成员变量值
  3. 默认拷贝为浅拷贝
  4. 浅拷贝是使用默认的clone()方法来实现 对象.clone()
深拷贝
  1. 复制对象的所有基本数据类型的成员变量值
  2. 为所有应用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象进行拷贝
  3. 深拷贝实现方式1:重写clone方法来实现深拷贝
  4. 深拷贝实现方式2:通过对象序列化实现深拷贝

代码1(深拷贝1,克隆方式)

羊类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Sheep implements Cloneable, Serializable {

    private String name;

    private Integer age;

    private String color;

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

管理羊 类 进行深拷贝

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ManagerSheep implements Cloneable, Serializable {

    private String name;

    private Sheep sheep;


    @Override
    protected Object clone() throws CloneNotSupportedException {
        //对基本数据类型和String进行克隆
        ManagerSheep managerSheep = (ManagerSheep) super.clone();
        //对类中的应用数据类型拷贝
        Sheep sheep = (Sheep) this.sheep.clone();
        managerSheep.setSheep(sheep);
        return managerSheep; 
    }
}

测试类

public static void main(String[] args) throws CloneNotSupportedException {
    ManagerSheep managerSheep = new ManagerSheep("张三", new Sheep("小羊", 23, "white"));
    ManagerSheep clone = (ManagerSheep) managerSheep.clone();
    System.out.println("before-managerSheep:" + managerSheep);
    System.out.println("before-clone:" + clone);

    //修改 
    clone.getSheep().setName("大羊");
    System.out.println("after-managerSheep:" + managerSheep);
    System.out.println("after-clone:" + clone);
}

代码2(深拷贝2,序列化方式,推荐)

public Object deepClone(){
    //创建流对象
    ByteArrayInputStream bis = null;
    ByteArrayOutputStream bos = null;
    ObjectInputStream ois = null;
    ObjectOutputStream oos = null;

    try {
        //序列化
        bos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(bos);
        oos.writeObject(this);
        //反序列化
        bis = new ByteArrayInputStream(bos.toByteArray());
        ois = new ObjectInputStream(bis);
        return ois.readObject();
    }catch (Exception e){
        e.printStackTrace();
        return null;
    }finally {
        //关闭流
        try {
            assert ois != null;
            ois.close();
            bis.close();
            oos.close();
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

原型模式在Spring源码的使用

spring中原型 bean的创建

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值