原型设计模式

概念解析

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

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

相关推荐
斯维赤3 分钟前
从 @Tool 到 Agent 流水线:LangChain4j 进阶教学,一个库打全套
java·后端
SimonKing15 分钟前
SSE项目`nexus-sse`持续优化,不一样的视觉效果
java·后端·程序员
斑鸠喳喳15 分钟前
读写锁模式 Read-Write Lock
java·后端
信誓旦旦的程序猿44 分钟前
【Python 量化取数指南 #09】Python 拿港股通数据:港股通成交与港股财报实测
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据api
小程序设计2 小时前
本科毕设避坑|大数据 / 单片机物联网 / 网络工程 / PLC / 机械设计选题与落地心得
java·hive·hadoop·单片机
卓怡学长2 小时前
w206基于SpringBoot的社区团购小程序设计与实现
java·spring boot·spring·intellij-idea
IT枫斗者枫哥7 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
代码方舟7 小时前
Java数据工程:利用天远全网运营商三要素优化线上实名认证合规体验
java·人工智能
BBmmo7 小时前
我的 Java 学习笔记 · 第 7 篇:泛型与通配符
java
独泪了无痕7 小时前
Hutool之RandomUtil:随机数生成的终极利器
java·后端