Considera la seguente implementazione di un modello di fabbrica statico ...
public class Names{
private static final Map<String, Name> NAME_MAP = new HashMap<>();
private final String firstName, lastName, strRep;
public static Name getInstance(String firstName, String lastName) throws IllegalArgumentException {
/*
Check parameters.
*/
String firstName = firstName.toUpperCase();
String lastName = lastName.toUpperCase();
String strRep = firstName + " " + lastName;
// "strRep" is a string concatenation which uses the first name and last name in conjunction.
if (strRep.matches("^[A-Z]+ [A-Z]+$")) {
strRep = firstName + " " + lastName;
Name name = NAME_MAP.get(strRep);
if (name == null) {
name = new Name(firstName, lastName, strRep);
NAME_MAP.put(strRep, name);
}
return name;
} else {
throw new IllegalArgumentException("The parameters entered are invalid.");
}
}
Consideriamo la situazione nella nostra base di codici che usiamo temporaneamente un nuovo oggetto Nome (diciamo come variabile locale). Poiché la mappa contiene un riferimento a un oggetto, ora sembra che dobbiamo pulire manualmente quella mappa. Questo è il contrario di fare affidamento sulla garbage collection per ripulire i riferimenti a oggetti inutilizzati (in normali costruttori). Esiste un modo preferito per ripulire tutti i riferimenti agli oggetti senza che un cliente usi la fabbrica per farlo manualmente?