创建型模式-原型模式
原型模式是一种创建型设计模式,其目的是通过克隆已有对象来创建新的对象,而无需使用昂贵的创建操作。
原型模式基于原型实例创建新对象,而不是通过调用构造函数。原型实例是通过克隆方法来创建新对象的,克隆方法可以是浅克隆或深克隆。
浅克隆(
Shallow Clone
)会创建一个新对象,但新对象的字段将引用原型对象中相同的字段。也就是说,原型对象和克隆对象共享相同的引用类型字段,而值类型字段则是独立的。深克隆(
Deep Clone
)会创建一个新对象,并且新对象的所有字段都是独立的,包括引用类型字段。这意味着,在深克隆过程中,不仅克隆了原型对象本身,还递归地克隆了其引用类型字段。
原型模式的主要优点
-
减少对象的创建成本:
通过克隆已有对象来创建新对象,避免了昂贵的创建操作,提高了创建对象的效率。
-
隐藏具体的对象创建细节:
原型模式将对象的创建过程封装在原型对象内部,客户端无需关心具体的创建细节。
-
支持动态添加和删除对象:
通过原型模式,可以在运行时动态地添加或删除原型对象,从而影响到克隆对象的创建。
原型模式注意事项
-
克隆方法的实现:
在实现原型模式时,需要正确实现克隆方法。对于深克隆,需要递归地克隆引用类型字段。
-
对象状态的处理:
克隆对象是一个新对象,但它可能共享一些引用类型字段。因此,在修改克隆对象的引用类型字段时,需要注意对原型对象和克隆对象的影响。
原型模式示例
以创建和克隆图形对象为例
import java.util.ArrayList;
import java.util.List;
// 抽象原型类
interface Shape extends Cloneable {
void draw();
Shape clone();
}
// 具体原型类 - 矩形
class Rectangle implements Shape {
private String type;
public Rectangle() {
this.type = "Rectangle";
}
public void draw() {
System.out.println("Drawing a rectangle.");
}
public Shape clone() {
return new Rectangle();
}
}
// 具体原型类 - 圆形
class Circle implements Shape {
private String type;
public Circle() {
this.type = "Circle";
}
public void draw() {
System.out.println("Drawing a circle.");
}
public Shape clone() {
return new Circle();
}
}
// 原型管理器
class ShapeManager {
private List<Shape> shapes;
public ShapeManager() {
shapes = new ArrayList<>();
}
public void addShape(Shape shape) {
shapes.add(shape);
}
public void removeShape(Shape shape) {
shapes.remove(shape);
}
public Shape cloneShape(int index) {
return shapes.get(index).clone();
}
}
// 客户端
public class Main {
public static void main(String[] args) {
ShapeManager shapeManager = new ShapeManager();
// 添加原型对象
shapeManager.addShape(new Rectangle());
shapeManager.addShape(new Circle());
// 克隆原型对象
Shape clonedShape1 = shapeManager.cloneShape(0);
Shape clonedShape2 = shapeManager.cloneShape(1);
// 使用克隆对象
clonedShape1.draw(); // 输出: Drawing a rectangle.
clonedShape2.draw(); // 输出: Drawing a circle.
}
}
在上述示例中,我们使用原型模式来创建和克隆图形对象。
Shape
接口是抽象原型类,定义了绘制图形和克隆方法。
Rectangle
和 Circle
是具体原型类,实现了抽象原型类接口,分别代表矩形和圆形对象。
ShapeManager
是原型管理器类,用于管理原型对象。客户端可以通过原型管理器添加、删除和克隆原型对象。
在客户端 Main
类中,我们创建了原型管理器对象,并添加了矩形和圆形原型对象。然后,我们使用原型管理器来克隆原型对象,并使用克隆对象调用绘制方法。
通过原型模式,我们可以通过克隆已有对象来创建新对象,避免了昂贵的创建操作,并且可以动态地添加或删除原型对象。这样可以提高对象创建的效率和灵活性。