Il modello Factory vogue deriva da una credenza quasi dogmatica tra i programmatori nei linguaggi "C-style" (C / C ++, C #, Java) che l'uso della parola chiave "new" è negativo e dovrebbe essere evitato a tutti i costi (o almeno centralizzato). Questo, a sua volta, deriva da un'interpretazione ultra-rigorosa del Principio di Responsabilità Unica (la "S" di SOLID), e anche del Principio di Inversione di Dipendenza (la "D"). In parole povere, l'SRP afferma che idealmente un oggetto di codice dovrebbe avere un "motivo per cambiare" e uno solo; che "la ragione per cambiare" è lo scopo centrale di quell'oggetto, la sua "responsabilità" nella base di codice, e qualsiasi altra cosa che richiede una modifica al codice non dovrebbe richiedere l'apertura di quel file di classe. Il DIP è ancora più semplice; un oggetto codice non dovrebbe mai dipendere da un altro oggetto concreto, ma invece da un'astrazione.
Caso in questione, utilizzando "nuovo" e un costruttore pubblico, si sta accoppiando il codice chiamante a uno specifico metodo di costruzione di una specifica classe concreta. Il tuo codice ora deve sapere che esiste una classe MyFooObject e ha un costruttore che accetta una stringa e un int. Se quel costruttore ha bisogno di più informazioni, tutti gli usi del costruttore devono essere aggiornati per passare in quelle informazioni incluso quello che stai scrivendo ora, e quindi è necessario che abbiano qualcosa di valido da passare, e quindi devono avere o o essere cambiato per ottenerlo (aggiungendo più responsabilità agli oggetti che consumano). Inoltre, se MyFooObject viene mai sostituito nella base di codice da BetterFooObject, tutti gli usi della vecchia classe devono cambiare per costruire il nuovo oggetto invece di quello vecchio.
Quindi, invece, tutti i consumatori di MyFooObject dovrebbero essere direttamente dipendenti da "IFooObject", che definisce il comportamento delle classi di implementazione incluso MyFooObject. Ora, i consumatori di IFooObjects non possono semplicemente costruire un IFooObject (senza avere la consapevolezza che una particolare classe concreta è un IFooObject, di cui non hanno bisogno), quindi invece deve essere data un'istanza di una classe o metodo di implementazione IFooObject dall'esterno, da un altro oggetto che ha la responsabilità di sapere come creare l'IFooObject corretto per la circostanza, che nel nostro linguaggio è solitamente nota come Fabbrica.
Ora, ecco dove la teoria incontra la realtà; un oggetto può mai essere chiuso a tutti i tipi di modifiche per tutto il tempo. Caso in questione, IFooObject è ora un oggetto codice aggiuntivo nella base di codice, che deve cambiare ogni volta che l'interfaccia richiesta dai consumatori o dalle implementazioni di IFooObjects cambia. Ciò introduce un nuovo livello di complessità coinvolto nel cambiare il modo in cui gli oggetti interagiscono tra loro attraverso questa astrazione. Inoltre, i consumatori dovranno ancora cambiare, e in modo più approfondito, se l'interfaccia stessa viene sostituita da una nuova.
Un buon programmatore sa come bilanciare YAGNI ("Non ne hai bisogno") con SOLID, analizzando il design e trovando i posti che molto probabilmente dovranno cambiare in un modo particolare, e rifattorizzandoli per essere più tollerante a quel tipo di cambiamento, perché in quel caso "voi vi avremo bisogno".