概念解析
原型模式(Prototype Pattern)是一种创建型设计模式,通过复制现有对象(原型)来创建新对象,避免重复初始化过程。核心优势在于:
- 降低对象创建成本(尤其当初始化过程复杂时)
- 动态添加或删除产品对象
- 避免构造函数的约束
实现要点
在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()
实现,复制基本类型字段,引用类型共享同一对象 -
深拷贝实现 :
javapublic class ComplexShape extends Shape { private Color color; // 引用类型字段 @Override public Object clone() { ComplexShape clone = (ComplexShape) super.clone(); clone.color = new Color(this.color); // 手动复制引用对象 return clone; } }
应用场景
- 需要高性能的对象创建(如游戏中的子弹生成)
- 避免重复初始化复杂对象(如数据库连接配置)
- 需要动态配置的对象系统(如GUI组件库)
- 状态保存与恢复(如撤销操作)
设计建议:当对象初始化成本高于复制成本时优先使用原型模式,结合工厂模式可构建更灵活的对象创建系统。