Recentemente ho appreso di MVC (model view controller) e sto cercando di rifattorizzare un programma esistente. Sono in una situazione in cui mi piacerebbe avere esattamente un oggetto di una particolare classe, quindi mi è sembrato evidente che dovrei usare un singleton. Questo singleton verrà utilizzato per mantenere una hashmap di determinate cose. Tuttavia questa hashmap dovrà essere inizializzata quando il singleton viene creato leggendo i nodi da un file xml e memorizzandoli come oggetti di classe.
Ora il mio dilemma è:
-
Se inizializzo gli attributi xml (leggendo e convertendo in oggetti classe), sto effettivamente facendo cose nella classe del modello che il controller dovrebbe fare, il che non è sicuramente buono.
-
Se metto il metodo di inizializzazione in una classe controller, dovrei fare riferimento a una classe controller da una classe modello, che non è conforme alla progettazione MVC.
-
Se metto l'intero singleton nel controller, allora dovrei cercare l'hashmap nel pacchetto controller, che vanifica lo scopo di avere classi modello.
-
Non posso passare una hashmap premade al singleton come parametro nè perché il costruttore è privato .. Beh, tecnicamente potrei, assegnandolo al metodo getInstance () come parametro, ma sembra un modo sporco di correggere, dal momento che ora o passa null ogni volta, o faccio un altro metodo getInstance () che non accetta un parametro.
In questo momento, il mio codice ha un aspetto simile a questo:
public class CategoryCatalog{
private static CategoryCatalog categoryCatalog;
private HashMap<CarOptionCategory, Set<ICarOption>> categoryOptionsMap;
private CategoryCatalog(){
categoryOptionsMap = new HashMap<CarOptionCategory, Set<ICarOption>>();
initialize();
}
public static CategoryCatalog getInstance(){
if(categoryCatalog == null){
categoryCatalog = new CategoryCatalog();
}
return categoryCatalog;
}
private void initialize(){
// TODO: xml
}
}
Sto trascurando qualcosa o dovrei usare un approccio diverso?