原型设计模式

概念解析

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

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

相关推荐
毕设源码-邱学长5 小时前
【开题答辩全过程】以 基于Java的学校住宿管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
兑生6 小时前
【灵神题单·贪心】1481. 不同整数的最少数目 | 频率排序贪心 | Java
java·开发语言
daidaidaiyu7 小时前
一文学习 Spring 声明式事务源码全流程总结
java·spring
零雲8 小时前
java面试:了解抽象类与接口么?讲一讲它们的区别
java·开发语言·面试
左左右右左右摇晃11 小时前
Java并发——synchronized锁
java·开发语言
sxlishaobin11 小时前
Java I/O 模型详解:BIO、NIO、AIO
java·开发语言·nio
彭于晏Yan11 小时前
Spring AI(二):入门使用
java·spring boot·spring·ai
有一个好名字12 小时前
vibe codeing 开发流程
java
兑生12 小时前
【灵神题单·贪心】3745. 三元素表达式的最大值 | 排序贪心 | Java
java·开发语言
polaris063012 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat