原型设计模式

概念解析

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

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

相关推荐
WSSWWWSSW12 分钟前
Tomcat 目录结构及JAR包说明
java·tomcat·jar
CYRUS STUDIO15 分钟前
打造自己的 Jar 文件分析工具:类名匹配 + 二进制搜索 + 日志输出全搞定
java·python·pycharm·jar·逆向
weixin_4561462632 分钟前
关于java8里边Collectors.toMap()的空限制
java
optimistic_chen1 小时前
【Java EE初阶 --- 网络原理】应用层---HTTP(HTTPS)协议
java·网络·http·https·java-ee
凌辰揽月1 小时前
贴吧项目总结二
java·前端·css·css3·web
黄名富1 小时前
Redisson 分布式锁
java·redis·分布式·缓存
转转技术团队1 小时前
游戏账号大图生成
java·后端
青云交2 小时前
Java 大视界 -- Java 大数据机器学习模型在金融市场波动预测与资产配置动态调整中的应用(355)
java·大数据·机器学习·lstm·金融市场·波动预测·资产配置
徐子童2 小时前
初识Redis---Redis的特性介绍
java·数据库·redis
Dubhehug2 小时前
6.String、StringBuffer、StringBuilder区别及使用场景
java·面试题·stringbuilder·string·stringbuffer