当前位置: 首页 > news >正文

【JAVA面试题】设计模式之原型模式

【JAVA面试题】设计模式之原型模式

一、原型模式核心概念

原型模式(Prototype Pattern) 是一种创建型设计模式,通过复制现有对象(原型)来创建新对象,避免反复初始化带来的性能损耗。适用于需要高频创建相似对象的场景。


二、原型模式实战案例:敌机生成优化

1. 原始方案性能缺陷

public class Client {
    public static void main(String[] args) {
        List<EnemyPlane> enemyPlanes = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            // 每次new对象导致性能损耗
            EnemyPlane ep = new EnemyPlane(new Random().nextInt(200));
            enemyPlanes.add(ep);
        }
    }
}

问题:循环内频繁实例化对象,触发类加载、初始化等流程,性能低下。


2. 原型模式优化实现

2.1 实现Cloneable接口
public class EnemyPlane implements Cloneable {
    private int x;
    private int y = 0;

    public EnemyPlane(int x) { this.x = x; }

    // 开放坐标修改(克隆后调整状态)
    public void setX(int x) { this.x = x; }

    @Override
    public EnemyPlane clone() throws CloneNotSupportedException {
        return (EnemyPlane) super.clone(); // JVM内存拷贝,效率极高
    }
}
2.2 原型工厂封装
public class EnemyPlaneFactory {
    private static EnemyPlane protoType = new EnemyPlane(200); // 原型实例
    
    public static EnemyPlane getInstance(int x) throws CloneNotSupportedException {
        EnemyPlane clone = protoType.clone();
        clone.setX(x); // 调整克隆体坐标
        return clone;
    }
}

优势:克隆仅需0 - 1 ms,相比new操作(10~50ms)性能提升10倍以上。


三、深浅拷贝核心问题与解决方案

  • 浅拷贝:只复制对象的值类型字段和引用类型字段的地址,导致多个对象共享同一个引用对象。

  • 深拷贝:不仅复制对象的值类型字段,还会递归复制引用类型字段的实际对象,确保每个对象都有独立的引用对象。

1. 浅拷贝陷阱

当对象包含引用类型字段时:

public class EnemyPlane implements Cloneable {
    private Bullet bullet = new Bullet(); // 引用类型
    // ...
    
    @Override
    public EnemyPlane clone() {
        return (EnemyPlane) super.clone(); // 浅拷贝:bullet地址被复制
    }
}

问题:克隆后的敌机会共享同一颗子弹对象,修改任意克隆体的子弹属性会影响所有实例。


2. 深拷贝实现

public class EnemyPlane implements Cloneable {
    private Bullet bullet;
    
    @Override
    public EnemyPlane clone() throws CloneNotSupportedException {
        EnemyPlane clone = (EnemyPlane) super.clone(); // 浅拷贝:复制值类型字段和引用地址
        clone.bullet = this.bullet.clone(); // 深拷贝:递归克隆引用对象
        return clone;
    }
}

// Bullet也需实现Cloneable
public class Bullet implements Cloneable {
    @Override
    public Bullet clone() throws CloneNotSupportedException {
        return (Bullet) super.clone();
    }
}

关键点

  • 所有嵌套对象都需实现Cloneable
  • 递归调用clone方法形成克隆链

四、原型模式应用场景

场景说明
对象创建成本高如需要复杂初始化的网络连接对象
高频创建相似对象游戏中的子弹/敌机生成、文档模板克隆
需要隔离对象创建细节不希望调用方依赖具体类构造函数

五、面试要点总结

  1. 原型模式核心价值

    • 避免重复初始化,提升对象创建性能
    • 简化复杂对象创建流程
  2. 深浅拷贝区别

    • 浅拷贝:复制值类型+引用地址(共享引用对象)
    • 深拷贝:完全复制值类型和引用对象(递归克隆)
  3. 实现深拷贝的三种方式

    • 递归实现Cloneable(如本文示例)
    • 序列化/反序列化(实现Serializable)
    • 使用第三方库(Apache Commons Lang3)
  4. JDK中的原型应用

    • ArrayList.clone()
    • Arrays.copyOf()
  5. 注意事项

    • 深拷贝可能引发循环引用问题
    • 需要处理final字段的特殊情况
    • 考虑使用原型管理器管理多种原型

相关文章:

  • 安装Linux操作系统
  • uni-app开发安卓和iOS 打包流程(云打包)
  • 代码随想录刷题学习日记
  • Oracle 11g的部署配置
  • go语言中字符串嵌套
  • 表格管理---React
  • Ubuntu 20.04下配置VSCode以支持ROS开发
  • Mysql面试篇笔记:
  • k8s架构及服务详解
  • CSS3中布局方式说明
  • C# OnnxRuntime部署DAMO-YOLO交通标识检测
  • Spring 中哪些情况下,不能解决循环依赖问题?
  • python环境检测
  • 责任链模式详解和在Spring Boot 项目中的使用场景
  • 软开经验总结
  • 【C语言】联合体 `union` 的妙用
  • 第十五届蓝桥杯:dfs之数字接龙
  • 深入解析雪花算法(Snowflake):分布式唯一ID的优雅解决方案
  • 1、CI/CD 平台安装部署(Gitlab+Jenkins)
  • 10个常见的Java面试问题及其答案
  • 马鞍山市原常务副市长黄化锋一审获刑11年,涉案金额三千余万元
  • 第19届威尼斯建筑双年展开幕,中国案例呈现“容·智慧”
  • 伊朗外长称正与美国进行“善意”的会谈
  • 14岁女生瞒报年龄文身后洗不掉,法院判店铺承担六成责任
  • 新疆维吾尔自治区乌鲁木齐市米东区政协原副主席朱文智被查
  • 又一日军“慰安妇”制度受害者去世,大陆在世幸存者仅7人