Ho lavorato a un progetto e ho trovato una soluzione funzionante, ma ora ho alcune domande su come ho risolto alcuni problemi nel codice. Prima di tutto, non sono esperto in schemi di design, ma conosco il modello (anti-) dei singleton e di solito li evito. Ma quello che uso abbastanza spesso, sono metodi% helper / utility% co.
Quindi il progetto su cui ho lavorato si basa sull'SDK del plug-in Atlassian. Ho implementato servlet, ho accesso ad alcuni dati tramite i componenti di Atlassian, tutto abbastanza semplice. Quando si arriva al punto di rendering delle pagine, le piattaforme Atlassian utilizzano Apache Velocity. Così costruisco la mia mappa di contesto e accedo agli oggetti in Velocity, tutto va bene. Ad un certo punto, voglio generare URL per collegarmi ad altri servlet o pagine. Quindi, creo una classe con metodi di generazione url static
. Purtroppo, non posso accedere a quei metodi in Velocity, perché non esiste alcuna istanza che possa passare al contesto Velocity (che definisce l'ambito). Ma Velocity mi consente di utilizzare metodi statici tramite istanze della classe. La classe risultante assomiglia a questo (codice java):
public class Urls {
private static Urls Singleton = new Urls();
public static Urls getInstance() {
return Singleton;
}
private Urls() { }
public static String getBaseUrl() { ... }
public static String forUserProfile(ApplicationUser user) { ... }
...
}
Ora, nel mio normale codice java, posso usare il metodo statico:
String myUrl = Urls.forUserProfile(myUser);
Ma posso anche passare il mio singleton al contesto velocity ...
context.put("urls", Urls.getInstance());
... per usarlo nel mio modello Velocity:
<a href="$urls.forUserProfile($myUser)">User profile</a>
Ho usato questo 'pattern' o altri simili nel mio progetto. C'è un nome per qualcosa di simile? Presumo che questo è piuttosto raro, perché normalmente si potrebbe semplicemente accedere ai metodi statici. Pensi che ci siano dei grossi svantaggi che ho dimenticato? Qualche ragione per non usare in questo modo? Qualche modo migliore?