原型设计模式

概念解析

原型模式(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. 状态保存与恢复(如撤销操作)

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

相关推荐
mqiqe9 分钟前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
伍一5111 分钟前
03-文件管理模块-一个看似简单的模块藏着多少细节
java·ruoyi·若依
gugucoding16 分钟前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
Nebula_g1 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
AC赳赳老秦2 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
小强库计算机毕业设计3 小时前
SpringBoot+Vue3 学生宿舍管理系统实战
java·spring boot·后端·vue·学生宿舍管理系统
李冰然3 小时前
深入Java集合框架:HashMap源码解析(JDK 8)
java
人道领域4 小时前
【0-1的agent进阶篇】RAG:从Embedding到检索增强生成的底层逻辑
java·embedding·agent·rag
桦说编程5 小时前
盘点并发集合里那些容易误判的行为
java·后端·性能优化
IT爱学堂6 小时前
java版数据结构和算法+AI算法和技能学习指南
java·开发语言