can we still use this pattern if ConcreteFactory1 needs to createProductC() but ConcreteFactory2 don't?
Sì. Sì, puoi.
È molto più semplice capire questo modello quando stai guardando un codice client.
class Client {
private AbstractFactory af;
public client(AbstractFactory af) { this.af = af; }
public toString() {
return String.format("%s %s %s",
af.createProductA(),
af.createProductB(),
af.createProductC());
}
}
Che potrebbe farti stampare
ProductA1 ProductB1 ProductC1
Oppure potrebbe farti stampare
ProductA2 ProductB2
Come tiriamo fuori quel po 'di magia? Pattern oggetto nullo! La mia implementazione preferita del modello di oggetto nullo è la stringa vuota: ""
Solo perché un oggetto esiste non significa che debba fare qualcosa. Quando segui il modello di oggetto nullo offri esattamente l'interfaccia prevista, ma chiamare i metodi fa un sacco di niente. Quindi, anche se il cliente chiedeva più di questi prodotti, solo i loro metodi toString()
il modello di oggetto nullo non farebbe nulla quando richiesto.
Quanto bene funziona dipende in gran parte da come è scritto il cliente. Noterai che ci rimane ancora uno spazio finale. Ma evitiamo di dover testare quale fabbrica astratta abbiamo. Questo è fondamentale per rimanere orientati agli oggetti.
L'oggetto nullo può essere complesso come il client ha bisogno che sia. Lo schema di base è quello di renderlo sicuro, ma privo di senso, per eliminarlo. Nessuna eccezione generata. I metodi che restituiscono il vuoto semplicemente non fanno nulla. Nessun effetto collaterale I metodi che restituiscono una stringa restituiscono la stringa vuota. I metodi che restituiscono i numeri restituiscono 0 o 1 a seconda che il client si aggiunga o si moltiplica. I metodi che restituiscono le collezioni restituiscono raccolte vuote. Anche le monadi possono essere restituite se è quello che il cliente si aspetta, purché, alla fine, non facciano nulla, in silenzio.