设计模式--原型模式(1)

本文通过克隆羊的比喻,深入浅出地介绍了Java中对象克隆的两种方式:传统方式与实现Cloneable接口的方式。对比了两者的优缺点,并详细解释了为何需要实现Cloneable接口。最后,介绍了在Spring框架中如何使用原型方式创建对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事例:克隆羊问题
现有一只羊叫tom,请创建和tom属性完全相同的十只羊

传统方式
定义 Sheep

public class Sheep {
    String name;

    Sheep(String name) {
        this.name = name;
    }

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

调用sheep,如果创建10只,需要new10次即可

public class SheepClient {

    public static void main(String[] args) {
        Sheep sheep = new Sheep("tom");
        Sheep sheep1 = new Sheep("tom");
        System.out.println(sheep1);
    }
}

好处:简单易懂
缺点:创建对象时,总要初始化属性,而不是动态获取运行时动态的属性,如果创建对象复杂时,效率比较低


Java的所有类都默认继承java.lang.Object类
Cloneable 中
在这里插入图片描述

为什么必须要实现Cloneable

因为如果不实现Cloneable接口,当调用clone()时会抛出CloneNotSupportedException异常

public class Sheep implements Cloneable {
    String name;

    Sheep(String name) {
        this.name = name;
    }

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

    @Override
    protected Sheep clone() {
        Sheep sheep = null;
        try {
            sheep = (Sheep) super.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println(e.getMessage());
        }

        return sheep;
    }
}

public class SheepClient {

    public static void main(String[] args) {
        Sheep sheep = new Sheep("tom");
        Sheep sheep2 = sheep.clone();
        System.out.println(sheep2);
    }
}

框架中原型的使用:Spring
Spring可使用原型方式创建对象scope设置为prototype
bean.xml
在这里插入图片描述
测试类
在这里插入图片描述
BeanFactory的实现类

先获取bean工厂
在这里插入图片描述
其内部是个同步代码块,返回ConfigurableListableBeanFactory
在这里插入图片描述
ConfigurableListableBeanFactory继承
在这里插入图片描述
AbstractBeanFactory实现ConfigurableBeanFactory
在这里插入图片描述
在这里插入图片描述
doGetBean中对配置中scope原型的处理
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值