Prototype
The Prototype Design Pattern is a creational pattern that enables the creation of new objects by copying an existing object. Prototype allows us to hide the complexity of making new instances from the client. The existing object acts as a prototype and contains the state of the object.
What is Prototype Design Pattern?
The prototype pattern is a creational design pattern which is required when object creation is a time-consuming, and costly operation, so we create objects with the existing object itself to by copying the existing ones.
- The newly copied object may change the same properties only if required. This approach saves costly resources and time, especially when object creation is a heavy process.
- One of the best available ways to create an object from existing objects is the clone() method. Clone is the simplest approach to implementing a prototype pattern. However, it is your call to decide how to copy existing objects based on your business model.
Suppose a user creates a document with a specific layout, fonts, and styling, and wishes to create similar documents with slight modifications.
Example
Complete code for the above example:
In the main class, PrototypeExample
, we create a concrete prototype (circlePrototype
) of a red circle. We then create a ShapeClient
and provide it with the red circle prototype. The client uses the prototype to create a new shape (redCircle
) using the createShape()
method. Finally, we draw the newly created red circle using its draw()
method.
Java
// Prototype interface
interface Shape {
Shape clone(); // Make a copy of itself
void draw(); // Draw the shape
}
// Concrete prototype
class Circle implements Shape {
private String color;
// When you create a circle, you give it a color.
public Circle(String color) {
this.color = color;
}
// This creates a copy of the circle.
@Override
public Shape clone() {
return new Circle(this.color);
}
// This is how a circle draws itself.
@Override
public void draw() {
System.out.println("Drawing a " + color + " circle.");
}
}
// Client code
class ShapeClient {
private Shape shapePrototype;
// When you create a client, you give it a prototype (a shape).
public ShapeClient(Shape shapePrototype) {
this.shapePrototype = shapePrototype;
}
// This method creates a new shape using the prototype.
public Shape createShape() {
return shapePrototype.clone();
}
}
// Main class
public class PrototypeExample {
public static void main(String[] args) {
// Create a concrete prototype (a red circle).
Shape circlePrototype = new Circle("red");
// Create a client and give it the prototype.
ShapeClient client = new ShapeClient(circlePrototype);
// Use the prototype to create a new shape (a red circle).
Shape redCircle = client.createShape();
// Draw the newly created red circle.
redCircle.draw();
}
}
Output
Drawing a red circle.
When to use the Prototype Design Pattern
Below is when to use prototype design pattern:
- Use the Prototype pattern when creating new objects is more complex or costly than copying existing ones. Cloning can be more efficient if significant resources are needed.
- The Prototype pattern is helpful for managing various objects with minor differences. Instead of creating multiple classes, you can clone and modify prototypes.
- Consider the Prototype pattern for dynamic configurations where you need to create objects at runtime. You can clone a base configuration and adjust it as necessary.
- The Prototype pattern can lower initialization costs, as cloning is often faster than building a new object from scratch, especially if initialization is resource-intensive.
When not to use the Prototype Design Pattern
Below is when not to use Prototype design pattern:
- Avoid using the Prototype pattern when your application predominantly deals with unique object instances, and the overhead of implementing the pattern outweighs its benefits.
- If object creation is simple and does not involve significant resource consumption, and there are no variations of objects, using the Prototype pattern might be unnecessary complexity.
- If your objects are immutable (unchangeable) and do not need variations, the benefits of cloning may not be significant.
- If your system has a clear and straightforward object creation process that is easy to understand and manage, introducing the Prototype pattern may add unnecessary complexity.