The Prototype Design Pattern is a creational pattern that involves creating new objects by copying an existing object, known as the prototype. This pattern is useful when the cost of creating a new object is more expensive than copying an existing one. It allows you to create objects without specifying their exact class and provides a way to clone objects efficiently.
Components of the Prototype Design Pattern:
- Prototype: An interface or abstract class that declares a
clone()
method for copying itself. - ConcretePrototype: Implements the
Prototype
interface and provides the implementation for theclone()
method. - Client: Uses the
clone()
method to create new instances of objects.
Simple Example:
Let’s create a simple example where we have a Shape
interface with a clone()
method. We will implement concrete prototypes like Circle
and Rectangle
that can be cloned.
1. Prototype Interface:
// Prototype interface
interface Shape extends Cloneable {
Shape clone();
void draw();
}
2. Concrete Prototypes:
// Concrete prototype for Circle
class Circle implements Shape {
private String color;
public Circle(String color) {
this.color = color;
}
@Override
public Shape clone() {
return new Circle(this.color);
}
@Override
public void draw() {
System.out.println("Drawing a " + color + " circle.");
}
}
// Concrete prototype for Rectangle
class Rectangle implements Shape {
private String color;
public Rectangle(String color) {
this.color = color;
}
@Override
public Shape clone() {
return new Rectangle(this.color);
}
@Override
public void draw() {
System.out.println("Drawing a " + color + " rectangle.");
}
}
3. Client Code:
public class PrototypePatternDemo {
public static void main(String[] args) {
// Create a Circle and a Rectangle with different colors
Shape circle1 = new Circle("Red");
Shape rectangle1 = new Rectangle("Blue");
// Clone the Circle and Rectangle
Shape circle2 = circle1.clone();
Shape rectangle2 = rectangle1.clone();
// Draw the original and cloned shapes
circle1.draw(); // Output: Drawing a Red circle.
circle2.draw(); // Output: Drawing a Red circle.
rectangle1.draw(); // Output: Drawing a Blue rectangle.
rectangle2.draw(); // Output: Drawing a Blue rectangle.
}
}
Explanation:
- Prototype Interface:
Shape
interface declares theclone()
method for cloning objects and adraw()
method for displaying the shape. - Concrete Prototypes:
Circle
andRectangle
implement theShape
interface and provide their own implementations of theclone()
method. - Client Code: Demonstrates creating and cloning objects using the
clone()
method. It shows that cloned objects have the same attributes as the original ones.
Benefits of the Prototype Pattern:
- Performance: Reduces the cost of creating new objects by cloning existing ones.
- Flexibility: Allows dynamic creation of objects and their variations.
- Simplicity: Simplifies object creation when objects have a large number of configurations.
Use Cases of the Prototype Pattern:
- Object Creation: When creating new instances is expensive or complex, and cloning is a more efficient option.
- Dynamic Object Creation: When objects need to be created dynamically with different configurations based on a prototype.
- Complex Objects: When objects have many properties or configurations that make instantiation complex.
The Prototype Pattern is particularly useful when you need to create multiple copies of objects with similar configurations, or when object creation is resource-intensive. It provides a clean way to manage and clone complex objects efficiently.