原型设计模式

概念解析

原型模式(Prototype Pattern)是一种创建型设计模式,通过复制现有对象(原型)来创建新对象,避免重复初始化过程。核心优势在于:

  1. 降低对象创建成本(尤其当初始化过程复杂时)
  2. 动态添加或删除产品对象
  3. 避免构造函数的约束
实现要点

在Java中实现原型模式需满足:

java 复制代码
// 1. 实现Cloneable接口(标记接口)
public abstract class Shape implements Cloneable {
    private String id;
    protected String type;
    
    // 2. 重写clone()方法
    @Override
    public Object clone() {
        try {
            return super.clone();  // 调用Object的native clone方法
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    // 抽象方法(由子类实现)
    abstract void draw();
}
具体原型实现
java 复制代码
public class Circle extends Shape {
    public Circle() {
        type = "Circle";
    }

    @Override
    void draw() {
        System.out.println("绘制圆形");
    }
}

public class Rectangle extends Shape {
    public Rectangle() {
        type = "Rectangle";
    }

    @Override
    void draw() {
        System.out.println("绘制矩形");
    }
}
原型注册与管理
java 复制代码
import java.util.HashMap;
import java.util.Map;

public class ShapeCache {
    private static final Map<String, Shape> shapeMap = new HashMap<>();

    // 预加载原型
    static {
        shapeMap.put("circle", new Circle());
        shapeMap.put("rectangle", new Rectangle());
    }

    // 获取克隆对象
    public static Shape getShape(String shapeId) {
        Shape cachedShape = shapeMap.get(shapeId);
        return (Shape) cachedShape.clone();  // 返回克隆对象
    }
}
客户端调用
java 复制代码
public class Client {
    public static void main(String[] args) {
        // 从缓存获取原型克隆
        Shape circle = ShapeCache.getShape("circle");
        Shape rectangle = ShapeCache.getShape("rectangle");
        
        circle.draw();    // 输出: 绘制圆形
        rectangle.draw(); // 输出: 绘制矩形
    }
}
深拷贝与浅拷贝
  • 浅拷贝 :默认clone()实现,复制基本类型字段,引用类型共享同一对象

  • 深拷贝实现

    java 复制代码
    public class ComplexShape extends Shape {
        private Color color; // 引用类型字段
        
        @Override
        public Object clone() {
            ComplexShape clone = (ComplexShape) super.clone();
            clone.color = new Color(this.color); // 手动复制引用对象
            return clone;
        }
    }
应用场景
  1. 需要高性能的对象创建(如游戏中的子弹生成)
  2. 避免重复初始化复杂对象(如数据库连接配置)
  3. 需要动态配置的对象系统(如GUI组件库)
  4. 状态保存与恢复(如撤销操作)

设计建议:当对象初始化成本高于复制成本时优先使用原型模式,结合工厂模式可构建更灵活的对象创建系统。

相关推荐
不知疲倦的仄仄6 小时前
MySQL/Read View快照/MVCC/串行化
java·数据库·mysql
奶糖 肥晨6 小时前
mac系统中Java项目环境配置与问题解决全记录|环境准备篇:JDK与Maven安装配置
java·macos·maven
SimonKing6 小时前
OpenCode 桌面版这 10 天偷偷迭代了 5 个版本,你还在用旧版吗?
java·后端·程序员
Dontla7 小时前
冒烟测试介绍(Smoke Test、BVT构建验证测试、构建验收测试)与回归测试对比、与单元测试对比、与集成测试对比、Cypress
java·单元测试·集成测试
暖和_白开水7 小时前
数据分析agent(十):loguru日志输出优化 和es 启动流程
java·elasticsearch·数据分析
减瓦7 小时前
Gradle 版本演进全景:构建工具的进化密码
java·gradle
玛丽莲茼蒿7 小时前
很难出错的Spring5(十)—— IOC进阶
java·开发语言·jvm
减瓦7 小时前
Jackson 使用指南
java·spring boot·json
Devin~Y7 小时前
互联网大厂 Java 面试实录:Spring Boot、MyBatis、Redis、Kafka、Spring Security、RAG 与 MCP 全链路问答
java·redis·kafka·mybatis·spring security·spring mvc·sprint boot
weixin_437662987 小时前
redisson
java