原型模式---多例

原型模式

碎碎念:由于从来没有了解过原型,导致我说原型的时候总是会说多例,用多例来形容原型其实并无大问题,但应该知道原型与多例其实是同一个东西(prototype),我在面试阿里的时候就出过这样的窘境,面试官在说原型原型,我在说多例多例,我总以为面试官跟我说的其实是不同的东西,害,其实原型就是多例,多例就是原型。

在原型模式之前,我们先来看看传统的模式是如何创建一样的对象,例如我要创建10个一样的student对象

Student xiaoming = new Student(10,'小明');

Student student1 = new Student(xiaoming.getAge(), xiaoming.getName());
Student student2 = new Student(xiaoming.getAge(), xiaoming.getName());
Student student3 = new Student(xiaoming.getAge(), xiaoming.getName());
Student student4 = new Student(xiaoming.getAge(), xiaoming.getName());
Student student5 = new Student(xiaoming.getAge(), xiaoming.getName());
Student student6 = new Student(xiaoming.getAge(), xiaoming.getName());
Student student7 = new Student(xiaoming.getAge(), xiaoming.getName());
Student student8 = new Student(xiaoming.getAge(), xiaoming.getName());
Student student9 = new Student(xiaoming.getAge(), xiaoming.getName());

传统的方式的优缺点:

  • 优点
    • 比较好理解,容易操作
  • 缺点
    • 在创建新的对象时,总是需要重新获取原始对象的属性,如果创建的对象比较复杂时,效率较低
    • 总是需要重新初始化对象,而不是动态地获取对象运行时的状态,不够灵活
  • 改进的思路
    • Java中的Object类是所有类的根类,Object类提供了一个clone()方法,该方法可以将一个Java对象复制一份,但是需要实现clone的Java类必须要实现一个接口Cloneable,该接口表示该类能够复制且具有复制的能力 => 原型模式

原型模式的定义

使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象

浅拷贝与深拷贝

涉及原型,即创建一个实例的多个相同对象时,就需要讨论浅拷贝与深拷贝的问题,这里详细聊一下浅拷贝与深拷贝

浅拷贝

  1. 对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。
  2. 对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是将该成员变量的引用之(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值
  3. 浅拷贝默认使用clone()方法实现

深拷贝

  1. 复制对象的所有基本数据类型的成员变量值
  2. 为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象进行拷贝
  3. 深拷贝方式
    1. 重写clone方法
    2. 序列化(推荐使用,使用输入流、输出流)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值