GOF23种设计模式——原型模式讲解,涵盖深拷贝、浅拷贝以及原型模式的相关注意事项,速通!!!

原型模式介绍

原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而不是通过使用构造函数创建。原型模式是通过将对象复制到一个新的对象中来实现的,这个新对象被称为原型。

在原型模式中,原型对象是一个已经创建好的对象,我们可以通过复制这个对象来创建新的对象。原型对象通常是通过实现一个Cloneable接口来指定的,该接口中定义了一个clone()方法,用于复制对象。通过复制原型对象,我们可以得到一个新的对象,这个新对象与原型对象具有相同或类似的属性。原型模式可以避免直接依赖其他对象的创建过程,从而简化了对象的创建过程。

原型模式的优点包括:

  1. 简化对象的创建过程:通过原型模式,我们可以通过复制一个现有对象来创建新对象,避免了直接创建对象的复杂过程。

  2. 提高性能:原型模式通常比使用new关键字创建对象更高效,因为复制一个对象比创建一个新对象要快。

  3. 可以动态添加或修改对象的属性:通过原型模式,我们可以在运行时动态地添加或修改对象的属性,而不需要修改原型对象。

  4. 可以使用原型对象来实现对象的共享池:通过原型模式,我们可以使用一组原型对象来创建对象的共享池,从而减少对象的创建和销毁的开销。

原型模式的缺点包括:

  1. 如果原型对象包含了很多复杂的属性,复制过程可能会变得非常复杂。

  2. 如果原型对象的属性发生了变化,那么所有基于该原型对象的复制对象也会受到影响。

原型模式手撕代码

需求:

用原型模式生成“三好学生”奖状 分析:同一学校的“三好学生”奖状除了获奖人姓名不同,其他都相同,属于相似对象的复制,同样可以用原型模式创建,然后再做简单修改就可以。

分析:

在这个例子中,我们可以使用原型模式来生成"三好学生"奖状。首先,我们需要创建一个奖状的原型对象,该对象包含了奖状的内容和样式。

在原型模式中,我们需要实现一个Cloneable接口,并重写clone()方法。在clone()方法中,我们可以通过复制原型对象来创建一个新的奖状对象,并修改其中的姓名属性。

下面是一个可能的实现示例:

// 定义奖状原型类
public class Certificate implements Cloneable {
    private String content;

    public Certificate(String content) {
        this.content = content;
    }

    // 实现Cloneable接口,重写clone()方法
    @Override
    public Certificate clone() {
        try {
            return (Certificate) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    // 修改奖状的姓名属性
    public void setName(String name) {
        this.content = content.replace("XXX", name);
    }

    // 打印奖状内容
    public void print() {
        System.out.println(content);
    }
}

// 使用原型模式生成奖状
public class Main {
    public static void main(String[] args) {
        Certificate prototype = new Certificate("恭喜XXX同学荣获三好学生奖");
        
        // 生成第一个奖状,并修改姓名
        Certificate certificate1 = prototype.clone();
        certificate1.setName("张三");
        certificate1.print();
        
        // 生成第二个奖状,并修改姓名
        Certificate certificate2 = prototype.clone();
        certificate2.setName("李四");
        certificate2.print();
        
        // ...
    }
}

在上面的示例中,我们首先创建了一个Certificate类作为奖状的原型对象。然后,我们在Main类中通过clone()方法复制原型对象并修改其中的姓名属性,从而生成新的奖状对象。最后,我们可以使用print()方法打印奖状的内容。

通过使用原型模式,我们可以方便地生成多个相似的奖状对象,并进行适当的修改。这样,我们就避免了重复创建奖状对象的复杂过程,提高了代码的可维护性和可扩展性。

深拷贝和浅拷贝

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

二、深拷贝
1、复制对象的所有基本数据类型的成员变量值
2、为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可以引用到的所有的对象。也就是说,对象进行深拷贝要对整个对象进行拷贝
3、深拷贝实现方式:
测试类

(1)重写clone()方法来实现深拷贝

启动类中:

运行结果:
深拷贝实现

(2)通过对象序列化实现深拷贝(推荐使用!)

原型模式注意事项和细节

在使用原型模式时,需要注意以下几个事项和细节:

  1. 原型模式适用于需要创建大量相似对象的情况,可以通过复制现有对象来提高创建对象的效率。
  2. 使用原型模式时,原型对象必须实现 Cloneable 接口,表示该对象可以被复制。
  3. 在原型模式中,克隆操作可以是浅克隆或深克隆。浅克隆只复制对象的基本类型属性,而深克隆还会复制对象的引用类型属性。
  4. 原型模式通过克隆来创建对象,避免了使用 new 关键字来创建对象,减少了对象的创建过程对系统性能的影响。
  5. 原型模式可以简化对象创建的过程,通过复制已有对象来创建新对象,避免了通过构造函数进行初始化的复杂过程。
  6. 使用原型模式时,需要注意深克隆可能会导致对象图过于复杂,而浅克隆可能会出现对象引用的问题。
  7. 原型模式要求原型对象内部状态的修改不会影响到克隆对象的状态,需要在克隆操作中注意状态的处理。
  8. 在使用原型模式时,可以通过原型管理器来统一管理原型对象,提供克隆方法供外部调用。
  9. 原型模式可以与其他设计模式结合使用,例如原型模式与工厂方法模式、建造者模式、单例模式等的结合应用。

至此,关于原型模式的介绍完毕,后续还会持续的更新更多关于设计模式的文章,希望大家能够持续的关注和支持!

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Be explorer

若认可笔者文章,手头富裕望支持

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

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

打赏作者

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

抵扣说明:

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

余额充值