Skip to main content

Prototype

Prototype design pattern is used to clone an existing object that is expensive to create

This pattern involves implementing a prototype interface which tells to create a clone of the current object. This pattern is used when creation of object directly is costly. For example, an object is to be created after a costly database operation. We can cache the object, returns its clone on next request and update the database as and when needed thus reducing database calls.

📎 Cela peut être le cas d'un logiciel de DAO comportant un copier coller.

L'utilisateur sélectionne un élément graphique (cercle, rectangle, ...), mais laclasse traitant la demande de copier coller ne connaît pas la classe exacte de l'élément à copier.

⇒ La solution est de disposer d'une duplication des instances (élément à copier : cercle, rectangle). La duplication peut être également intéressante pour les performances (la duplication est plus rapide que l'instanciation).

Example + implementation

We're going to create an abstract class Shape and concrete classes extending the Shape class. A class ShapeCache is defined as a next step which stores shape objects in a Hashtable and returns their clone when requested.

PrototypPatternDemo, our demo class will use ShapeCache class to get a Shape object.

https://www.tutorialspoint.com/design_pattern/images/prototype_pattern_uml_diagram.jpg

The shapeclass is implementing the Cloneable interface

public abstract class Shape implements Cloneable {

private String id;
protected String type;

abstract void draw();

public String getType() {
return type;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public Object clone() {
Object clone = null;

try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}

return clone;
}
}

import java.util.Hashtable;

public class ShapeCache {

private static Hashtable<String, Shape> shapeMap = new Hashtable<String, Shape>();

//**********cloning a shape**************
public static Shape getShape(String shapeId) {
Shape cachedShape = shapeMap.get(shapeId);
return (Shape) cachedShape.clone();
}

// for each shape run database query and create shape
// shapeMap.put(shapeKey, shape);
// for example, we are adding three shapes

public static void loadCache() {
Circle circle = new Circle();
circle.setId("1");
shapeMap.put(circle.getId(), circle);

Square square = new Square();
square.setId("2");
shapeMap.put(square.getId(), square);

Rectangle rectangle = new Rectangle();
rectangle.setId("3");
shapeMap.put(rectangle.getId(), rectangle);
}
}

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());
}
}