原型模式是一种常用的创建型设计模式,它通过复制现有对象来创建新对象,从而避免了重复创建对象的开销。以下是原型模式的一些应用场景及 Java 实例:
应用场景:
-
当一个对象需要在不同的上下文中多次使用时,可以使用原型模式来避免重复创建该对象,从而提高程序性能。
-
当一个对象的创建过程比较复杂,需要消耗大量时间和资源时,可以使用原型模式来减少创建对象的开销。
-
当一个对象需要在运行时动态创建时,可以使用原型模式来根据需要复制已有对象。
Java 实例:
以下是一个简单的 Java 实例,演示了如何使用原型模式来创建和复制对象:
public abstract class Shape implements Cloneable {
private String id;
protected String type;
public String getType(){
return type;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public abstract void draw();
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
public class Circle extends Shape {
public Circle(){
type = "Circle";
}
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
public class Rectangle extends Shape {
public Rectangle(){
type = "Rectangle";
}
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class PrototypePatternDemo {
public static void main(String[] args) {
ShapeCache.loadCache();
Shape clonedShape = (Shape) ShapeCache.getShape("1");
System.out.println("Shape : " + clonedShape.getType());
Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
System.out.println("Shape : " + clonedShape2.getType());
Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
System.out.println("Shape : " + clonedShape3.getType());
}
}
public class ShapeCache {
private static Hashtable<String, Shape> shapeMap = new Hashtable<String, Shape>();
public static Shape getShape(String shapeId) {
Shape cachedShape = shapeMap.get(shapeId);
return (Shape) cachedShape.clone();
}
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);
// ...
}
}
以上示例中,ShapeCache
类维护了一个 Hashtable
,用于存储不同类型的 Shape
对象,通过 getShape()
方法来获取对象,而对象的创建和初始化则是在 loadCache()
方法中进行的。Shape
类是一个抽象类,通过实现 Cloneable
接口,可以实现对象的克隆。具体的 Shape
子类(如 Circle
和 Rectangle
)实现了 draw()
方法,用于绘制具体的形状。在 main()
方法中,通过 ShapeCache
来获取不同类型的 Shape
对象,并打印出其类型。
在上述示例中,当需要创建一个新的形状时,只需要调用 ShapeCache.getShape()
方法即可。这个方法会在内存中查找对应的 Shape
对象,并进行复制。由于复制对象比创建新对象的成本要低得多,因此使用原型模式能够提高程序的性能和效率。
需要注意的是,原型模式在实际应用中需要谨慎使用。如果被复制的对象有引用类型的成员变量,那么这些成员变量将会被浅复制,而不是深复制。这可能会导致一些意外的问题,因此在使用原型模式时需要仔细考虑这些因素。