java设计模式【原型模式】

java设计模式【原型模式】

抽象模式

原型模式是一种创建型设计模式,用于在保证性能的情况下创建新的对象实例。

它允许一个对象创建另一个可定制的对象,而无需知道创建的细节。其工作原理是通过拷贝实现对象创建,即clone()。原型模式类似于工厂模式,提供了隔离对象与使用者之间的耦合关系,绕开了new的过程,但需要这些具体的对象有稳定的接口。

原型模式的应用场景包括:利用拷贝替换构造对象,提升效率;避免了重复new相同对象的操作。

优缺点

优点

  1. 性能高:使用原型模式复用的方式创建实例对象,比使用构造函数重新创建对象性能要高。
  2. 简化创建过程:原型模式可以简化创建的过程,可以直接修改现有的对象实例的值,达到复用的目的。

缺点

  1. 需要实现克隆方法:原型模式需要实现克隆方法,这个方法需要复制对象的所有属性,并且确保对象之间的引用关系正确。
  2. 可能会引入循环引用:如果对象之间存在循环引用,那么实现克隆方法就变得比较复杂,需要确保循环引用的问题得到解决。
  3. 可能会违反开闭原则:当实现深克隆时,需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。

总的来说,原型模式在性能和创建过程方面有优势,但需要解决一些克隆方法和循环引用的问题。

浅克隆

将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。

深克隆

将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深克隆进行了完全彻底的复制,而浅克隆不彻底。

Java中Object类是所有类的父类,Object 类提供了一个clone()方法,该方法可以将一个Java对象复制一份,但是需要实现clone的Java类必须要实现一个接口Cloneable,该接口表示该类能够复制且具有复制的能力,如果一个类没有实现这个接口但是调用了clone()方法,Java编译器将会抛出一个CloneNotSupportedException异常。Object类clone()方法是个原生方法,克隆的对象是浅克隆。

原型模式示例

在这里插入图片描述

原型模式有以下四个角色:

  1. Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,它可以是抽象类也可以是接口,甚至还可以是具体实现类。

  2. ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。

  3. Client(客户类):在客户类中,让一个原型对象克隆自身从而创建一个新的对象,只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。

具体原型类

/**
 * @author physicx
 * @date 2023/6/30 上午11:10
 * @desc 具体原型类
 * Created with IntelliJ IDEA
 */@Data
public class Prototype implements Cloneable {

    private String name;

    private String age;

    private Profession profession;

    @Override
    public Prototype clone() {
        try {
            return (Prototype) super.clone();
        } catch (CloneNotSupportedException e) {
            throw AppCode.B99999.toCodeException("不支持克隆");
        }
    }

}
/**
 * @author physicx
 * @date 2023/6/30 上午11:14
 * @desc 职业
 * Created with IntelliJ IDEA
 */
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Profession {

    private String name;

    private String type;

}

客户端类:

public static void main(String[] args) {
        Prototype prototype = new Prototype();
        prototype.setName("张三");
        prototype.setAge("16");
        prototype.setProfession(new Profession("律师", "专业人士"));

        Prototype clone = prototype.clone();
        System.out.println("原型对象:" + prototype);
        System.out.println("克隆对象:" + clone);
        System.out.println("克隆对象和原型对象是否相同:" + (clone == prototype));
        System.out.println("克隆对象的引用类型和原型对象引用类型对象是否相同:" + (clone.getProfession() == prototype.getProfession()));
    }

这种,Object类相当于抽象原型类,所有实现了Cloneable接口的类相当于具体原型类。

运行客户端调用结果如下:

在这里插入图片描述
应用类型克隆后相同,可以看出Object对象的原生clone()方法是浅克隆。

补充说明

后续会依次更新 详解java 23种设计模式,欢迎关注、交流、补充相关内容(如下)。

快捷导航
设计模式简介总结
单例模式详解
工厂方法模式详解
抽象工厂模式详解
原型模式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值