1、简述
原型模式(Prototype Pattern)是一种创建型设计模式,通过复制现有对象来创建新对象,而无需依赖于构造函数。这种模式通常用于对象创建成本较高,或需要大量相似对象的场景。
设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git
本文将详细介绍原型模式的核心概念、优缺点以及实际应用案例。
2、什么是原型模式?
原型模式是一种通过克隆已有对象来创建新对象的设计模式。它的核心思想是:
- 通过实现一个原型接口(通常是
Cloneable
接口)来复制现有对象。 - 克隆操作可以避免创建新对象时昂贵的初始化过程。
- 克隆的结果可以根据需要修改。
原型模式包含以下几个核心角色:
- 抽象原型(Prototype):定义一个克隆自身的方法。
- 具体原型(Concrete Prototype):实现克隆方法并返回自身的副本。
- 客户端(Client):通过调用原型的克隆方法来获取新对象,而不是直接实例化。
3、实际案例
假设我们有一个图形绘制系统,系统中需要创建大量相似的图形对象,例如圆形、矩形等。每次从头创建一个图形对象可能效率低下,而通过原型模式可以快速克隆现有对象。
import java.util.HashMap;
import java.util.Map;
// 抽象原型
public abstract class Shape implements Cloneable {
private String id;
private String type;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public abstract void draw();
}
// 具体原型:圆形
public class Circle extends Shape {
public Circle() {
setType("Circle");
}
@Override
public void draw() {
System.out.println("Drawing a Circle");
}
}
// 具体原型:矩形
public class Rectangle extends Shape {
public Rectangle() {
setType("Rectangle");
}
@Override
public void draw() {
System.out.println("Drawing a Rectangle");
}
}
// 原型管理器
public class ShapeCache {
private static Map<String, Shape> shapeMap = new HashMap<>();
public static Shape getShape(String shapeId) {
Shape cachedShape = shapeMap.get(shapeId);
try {
return (Shape) cachedShape.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
public static void loadCache() {
Circle circle = new Circle();
circle.setId("1");
shapeMap.put(circle.getId(), circle);
Rectangle rectangle = new Rectangle();
rectangle.setId("2");
shapeMap.put(rectangle.getId(), rectangle);
}
}
// 测试类
public class PrototypePatternDemo {
public static void main(String[] args) {
ShapeCache.loadCache();
Shape clonedShape1 = ShapeCache.getShape("1");
System.out.println("Shape: " + clonedShape1.getType());
clonedShape1.draw();
Shape clonedShape2 = ShapeCache.getShape("2");
System.out.println("Shape: " + clonedShape2.getType());
clonedShape2.draw();
}
}
输出:
Shape: Circle
Drawing a Circle
Shape: Rectangle
Drawing a Rectangle
4、原型模式的优缺点
优点
- 性能优化:通过克隆对象而不是重新初始化,节省资源和时间。
- 减少耦合:客户端无需知道具体类的实现细节,只需要调用克隆方法。
- 动态对象创建:通过原型模式可以动态创建对象,而无需预定义类。
缺点
- 深拷贝与浅拷贝:实现深拷贝可能比较复杂,需要额外处理引用类型字段。
- 对克隆方法依赖:需要实现
Cloneable
接口并覆盖clone
方法,有时可能不便。
5、应用场景
- 资源密集型对象:如对象的初始化需要加载大量数据或消耗系统资源时。
- 重复对象创建:如游戏中创建大量敌人、NPC等相似对象。
- 复杂对象的修改:需要对现有对象进行小范围修改时,可以先克隆后调整。
6、总结
原型模式是一种高效的对象创建方式,特别适合需要大量创建相似对象的场景。通过克隆对象,可以避免昂贵的初始化操作,并提高程序性能。在实际开发中,结合浅拷贝与深拷贝,可以更灵活地运用原型模式。
希望本文能帮助您更好地理解和应用原型模式!如有问题或建议,欢迎交流讨论!
评论区