设计模式之原型模式

目录

原型模式介绍

原型模式的使用

深克隆(deep clone)和浅克隆(shallow clone)的区别

原型模式的优点

原型模式的缺点

原型模式在Spring中的应用


原型模式介绍

原型模式是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,调用者不需要知道任何创建细节,不调用构造函数。
适用场景:
1.类初始化消耗资源较多
2.new产生的一个对象需要非常繁琐的过程(数据准备,访问权限等)
3.构造函数比较复杂。
4.循环体重生产大量的对象时。

原型模式的使用

创建一个Prototype类,其中有私有成员变量name,age,hobbies,实现Cloneable接口重写clone方法。

@Data
public class Prototype implements Cloneable{
    private String name;
    private Integer age;
    private List<String> hobbies;

    @Override
    protected Object clone() {
        Prototype prototype = null;
        try {
            prototype = (Prototype) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return prototype;
    }
}

 调用clone方法克隆一个Prototype对象,判断是否是同一个引用,判断hobbies是否是同一个引用

public class Client {
    public static void main(String[] args){
        Prototype prototype = new Prototype();

        prototype.setName("张三");
        prototype.setAge(19);
        List hobbies = new ArrayList<>();
        hobbies.add("看书");
        hobbies.add("写字");
        hobbies.add("画画");
        prototype.setHobbies(hobbies);

        Prototype prototype1 = (Prototype) prototype.clone();
        System.out.println(prototype==prototype1);
        System.out.println(prototype.getHobbies()==prototype1.getHobbies());

    }

}

结果显示Prototype不是同一引用,但是hobbies却是同一个,这说明Cloneable默认的clone方法只是浅拷贝。

false
true

实现Cloneable接口默认的clone方法只是浅克隆,对于引用对象克隆的是对象的地址,如果修改克隆对象的引用属性会导致原型对象数据也会被修改

深克隆(deep clone)和浅克隆(shallow clone)的区别


1.数据拷贝后两者之间是否有关联
2.改变一个值是否会影响另一个数值变化

浅克隆常用的API
1.工具类BeanUtils和PropertyUtils进行对象复制
  spring的BeanUtils(copyProperty和copyProperties方法)
  commons的BeanUtils(copyProperties方法)
2.实现Clonenable接口
3.Arrays.copyOf(),但在ArrayList中实现了深克隆的效果(重写了clone方法)

深克隆常用的API
1.每个对象都要实现Clonenable接口并重写Object类中的clone方法
2.序列化,必须实现Serializable接口
3.Apache Commons工具包SerializationUtils.clone()
4.通过Json工具类实现深克隆
5.通过构造方法实现深克隆(手动new对象)

原型模式的优点


性能优良,java自带的原型模式是基于内存二进制流的拷贝,比直接new一个对象性能上提升了许多。
可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,简化了创建
过程。


原型模式的缺点


必须配备克隆(或者可拷贝)方法
当对已有类进行改造的时候,需要修改代码,违反了开闭原则。
深拷贝,浅拷贝需要运用得当。

原型模式在Spring中的应用

在 Spring 中原型 bean 的创建,就是使用得原型设计模式

比如我们在配置 Spring 的 bean 的时候,Spring 的 bean 默认是单例,有这么个标签scope="prototype", 设置为prototype则是原型的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值