Un indicador simple de cuándo una plantilla mejoraría su código, es cuando ve que su código con frecuencia requiere que eche un objeto a un tipo diferente. Un ejemplo que encontré en mi propio código Java, que me activó para convertir una firma de método existente en una plantilla:
public MsgBase getLastSentMessage(Class<? extends MsgBase> msgBaseClass)
Mi código de cliente siempre se veía así:
OrderResponse response = (OrderResponse) getLastSentMessage(OrderResponse.class);
y cada vez que usaba ese método, tenía que convertir el resultado a la subclase correcta del tipo MsgBase. La firma del método mejorado fue:
public <T extends MsgBase> T getLastSentMessage(Class<T> clazz)
Ahora el código del cliente era:
OrderResponse response = getLastSentMessage(OrderResponse.class);
Para resumir, si te encuentras haciendo una gran cantidad de casting que parece innecesario, puedes tener un buen caso en el que una plantilla limpiará tu código.
Actualización: una mejor manera de generalizar la declaración anterior:
Cuando su clase fuente será utilizada por objetos de muchos tipos diferentes, y la clase fuente puede interactuar con esos tipos en un nivel más alto (más abstracto), pero sus clases cliente quieren interactuar con subtipos específicos, ese es un caso para usar plantillas . (Las clases Contenedor / Lista son el ejemplo bien conocido).