Java 原型模式:二维空间圆的浅克隆实现及原理剖析
原型模式是一种创建型设计模式,它允许你通过复制现有对象来创建新对象,而无需从头开始构造。在Java中,可以通过实现`Cloneable`接口并重写`clone`方法来实现浅克隆。 下面是一个示例,展示了如何使用原型模式实现一个二维空间中的圆(`Circle`)和点(`Point`),并对圆进行浅克隆。 Point 类 ```java public class Point implements Cloneable { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "Point{" + "x=" + x + ", y=" + y + '}'; } } ``` Circle 类 ```java public class Circle implements Cloneable { private Point origin; private double radius; public Circle(Point origin, double radius) { this.origin = origin; this.radius = radius; } public Point getOrigin() { return origin; } public void setOrigin(Point origin) { this.origin = origin; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } @Override protected Object clone() throws CloneNotSupportedException { // 浅克隆,只复制对象本身,不复制引用的对象 Circle clonedCircle = (Circle) super.clone(); return clonedCircle; } @Override public String toString() { return "Circle{" + "origin=" + origin + ", radius=" + radius + '}'; } } ``` 测试代码 ```java public class PrototypePatternDemo { public static void main(String[] args) { try { Point originalPoint = new Point(0, 0); Circle originalCircle = new Circle(originalPoint, 5.0); System.out.println("Original Circle: " + originalCircle); // 浅克隆 Circle clonedCircle = (Circle) originalCircle.clone(); System.out.println("Cloned Circle: " + clonedCircle); // 修改原始圆的原点 originalCircle.getOrigin().setX(10); originalCircle.getOrigin().setY(10); System.out.println("Modified Original Circle: " + originalCircle); System.out.println("Cloned Circle after modification: " + clonedCircle); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } } ``` 输出结果 ``` Original Circle: Circle{origin=Point{x=0, y=0}, radius=5.0} Cloned Circle: Circle{origin=Point{x=0, y=0}, radius=5.0} Modified Original Circle: Circle{origin=Point{x=10, y=10}, radius=5.0} Cloned Circle after modification: Circle{origin=Point{x=10, y=10}, radius=5.0} ``` 解释 - 浅克隆:在浅克隆中,`Circle`对象被复制了,但其内部的`Point`对象没有被复制。原始圆和克隆圆共享同一个`Point`对象。 - 修改原点:当修改原始圆的原点时,克隆圆的原点也会随之改变,因为它们引用的是同一个`Point`对象。 如果你需要实现深克隆(即复制所有引用的对象),可以在`Circle`类的`clone`方法中手动克隆`Point`对象。例如: ```java @Override protected Object clone() throws CloneNotSupportedException { Circle clonedCircle = (Circle) super.clone(); clonedCircle.origin = (Point) origin.clone(); return clonedCircle; } ``` 这样,克隆的圆将拥有一个新的`Point`对象,而不是共享原始圆的`Point`对象。 ######[AI写代码神器 | 920点数解答 | 2024-11-07 16:28:02]
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)438
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)337
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1232
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)382
- 探秘 Linux sensors 原理:从硬件读取到数据监测的全面剖析(GPT | 407点数解答 | 2024-10-21 16:06:25)275
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)352
- "Java Code: Uncovering Stock Statistics through CSV File Reading"(字节豆包 | 66点数解答 | 2024-11-13 15:31:04)347
- Java 继承实现:重温经典剪刀石头布游戏(字节豆包 | 451点数解答 | 2024-10-20 19:57:58)485
- Java实现日期递增:无数据返20250901,遇20250901返20250902及开发注意要点 (DeepSeek | 242点数解答 | 2025-09-02 11:39:53)96
- 深度解析:Vue中MVVM模式的组成、原理与双向数据绑定优势 (阿里通义 | 249点数解答 | 2023-11-09 00:56:24)278
- Android开发:Kotlin实现Builder模式示例及优势解析(百度文心 | 456点数解答 | 2023-11-09 17:29:15)262
- 工程师必知:PO模式与Page Factory的深度解析(百度文心 | 132点数解答 | 2023-11-09 18:33:18)295