Negli ultimi mesi, ho inciampato alcune volte sulla seguente tecnica / modello. Tuttavia, non riesco a trovare un nome specifico, né sono sicuro al 100% di tutti i suoi vantaggi e svantaggi.
Lo schema è il seguente:
All'interno di un'interfaccia Java, un insieme di metodi comuni viene definito come al solito. Tuttavia, utilizzando una classe interna, un'istanza predefinita viene divulgata tramite l'interfaccia.
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static Vehicle getInstance() {
return new Car(); // or use Spring to retrieve an instance
}
}
}
Per me, sembra che il più grande vantaggio risieda nel fatto che uno sviluppatore deve solo conoscere l'interfaccia e non le sue implementazioni, ad es. nel caso voglia rapidamente creare un'istanza.
Vehicle someVehicle = Vehicle.Default.getInstance();
someVehicle.accelerate();
Inoltre, ho visto questa tecnica utilizzata insieme a Spring per fornire dinamicamente delle istanze a seconda della configurazione. A questo proposito, sembra che questo possa aiutare con la modularizzazione.
Tuttavia, non posso scuotere la sensazione che si tratti di un uso improprio dell'interfaccia poiché accoppia l'interfaccia con una delle sue implementazioni. (Principio di inversione delle dipendenze, ecc.) Qualcuno potrebbe spiegarmi come viene chiamata questa tecnica, nonché i suoi vantaggi & svantaggi?
Aggiornamento:
Dopo un po 'di tempo per riflettere, ho ricontrollato e ho notato che la seguente versione singleton del pattern è stata usata molto più spesso. In questa versione, un'istanza statica pubblica viene esposta attraverso l'interfaccia che viene inizializzata solo una volta (a causa del fatto che il campo è definitivo). Inoltre, l'istanza viene quasi sempre recuperata utilizzando Spring o uno stabilimento generico che disaccoppia l'interfaccia dall'implementazione.
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static final Vehicle INSTANCE = getInstance();
private static Vehicle getInstance() {
return new Car(); // or use Spring/factory here
}
}
}
// Which allows to retrieve a singleton instance using...
Vehicle someVehicle = Vehicle.Default.INSTANCE;
In breve: sembra che questo sia un modello personalizzato singleton / factory, che fondamentalmente permette di esporre un'istanza o un singleton attraverso la sua interfaccia. Rispetto agli svantaggi, alcuni sono stati nominati nelle risposte & commenti sotto. Finora, il vantaggio sembra essere nella sua convenienza.