1. 概念
原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是通过实例化类来创建。这种模式适用于对象的创建成本较高,或者对象的创建过程比较复杂,但新创建的对象只需要与现有对象稍有差异的情况。
核心概念
原型模式的核心是一个原型对象,它是被复制的对象,该对象作为新对象的模板。通过克隆原型对象,可以得到一个新的对象,新对象的创建过程由原型对象完成,因此不需要知道具体的实例化细节。
原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是通过实例化类来创建。这种模式适用于对象的创建成本较高,或者对象的创建过程比较复杂,但新创建的对象只需要与现有对象稍有差异的情况。
核心概念
原型模式的核心是一个原型对象,它是被复制的对象,该对象作为新对象的模板。通过克隆原型对象,可以得到一个新的对象,新对象的创建过程由原型对象完成,因此不需要知道具体的实例化细节。
结构
原型模式通常包含以下几个角色:
- 抽象原型类(Prototype):声明一个克隆自身的接口方法,用于复制生成新对象。
- 具体原型类(Concrete Prototype):实现抽象原型类的接口方法,以便复制自身并生成新对象。
- 客户端(Client):使用原型对象的客户端,在需要创建新对象时,通过克隆原型对象来得到新的实例。
2. 示例
下面给出一个使用Java实现的原型模式的示例。在这个示例中,我们将创建一个简单的图形类 Shape
,并通过原型模式来克隆这些图形对象。
Shape 类定义
首先定义一个抽象的 Shape
类,作为图形对象的原型,其中包含抽象的 clone
方法用于复制图形对象。
// 抽象原型类 Shape
public abstract class Shape implements Cloneable {
private String type;
public abstract void draw();
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
// 克隆方法
@Override
public Shape clone() {
Shape clone = null;
try {
clone = (Shape) super.clone(); // 浅拷贝
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
具体图形类
然后创建具体的图形类,例如 Circle
和 Rectangle
,这些类继承自 Shape
类并实现具体的 draw
方法。
// 具体图形类 Circle
public class Circle extends Shape {
public Circle() {
setType("Circle");
}
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
// 具体图形类 Rectangle
public class Rectangle extends Shape {
public Rectangle() {
setType("Rectangle");
}
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
客户端代码
最后,在客户端代码中使用原型模式来克隆图形对象,并调用相应的方法。
public class Client {
public static void main(String[] args) {
// 创建原型图形对象
Shape circle = new Circle();
Shape rectangle = new Rectangle();
// 克隆图形对象
Shape clonedCircle = circle.clone();
Shape clonedRectangle = rectangle.clone();
// 使用克隆对象
System.out.println("Original Circle Type: " + circle.getType());
circle.draw();
System.out.println("Cloned Circle Type: " + clonedCircle.getType());
clonedCircle.draw();
System.out.println("Original Rectangle Type: " + rectangle.getType());
rectangle.draw();
System.out.println("Cloned Rectangle Type: " + clonedRectangle.getType());
clonedRectangle.draw();
}
}
在上面的示例中,我们首先创建了 Circle
和 Rectangle
类作为具体的图形类,它们都继承自 Shape
抽象类,并实现了 draw
方法。然后,在客户端代码中,我们创建了原型图形对象 circle
和 rectangle
,并通过调用它们的 clone
方法来克隆得到 clonedCircle
和 clonedRectangle
。最后,我们通过使用克隆对象来调用相应的 draw
方法,验证了原型模式的使用。
在实际应用中,原型模式可以帮助我们在不直接实例化对象的情况下创建新对象,通过克隆已有对象来节省资源和时间,同时保持对象的状态独立性。