La moda del modello Factory deriva da una credenza quasi dogmatica tra i programmatori nei linguaggi "C-style" (C / C ++, C #, Java) che l'uso della "nuova" parola chiave è male e dovrebbe essere evitato a tutti i costi (o a meno centralizzato). Questo, a sua volta, deriva da un'interpretazione ultra-rigorosa del principio di responsabilità singola (la "S" di SOLID) e anche del principio di inversione di dipendenza (la "D"). In poche parole, l'SRP afferma che idealmente un oggetto codice dovrebbe avere una "ragione per cambiare" e una sola; quel "motivo per cambiare" è lo scopo centrale di quell'oggetto, la sua "responsabilità" nella base di codice e qualsiasi altra cosa che richieda 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,
Nel caso specifico, usando "new" e un costruttore pubblico, si sta accoppiando il codice chiamante a un metodo di costruzione specifico di una specifica classe di calcestruzzo. 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 sempre bisogno di più informazioni, tutti gli usi del costruttore devono essere aggiornati per passare quelle informazioni incluso quello che stai scrivendo ora, e quindi devono avere qualcosa di valido per passare, e quindi devono avere o essere cambiato per ottenerlo (aggiungendo più responsabilità agli oggetti che consumano). Inoltre, se MyFooObject viene mai sostituito nel codebase da BetterFooObject, tutti gli usi della vecchia classe devono cambiare per costruire il nuovo oggetto invece di quello vecchio.
Pertanto, invece, tutti i consumatori di MyFooObject dovrebbero dipendere direttamente 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 devono ricevere un'istanza di una classe o di un metodo che implementano 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 è generalmente conosciuta come Fabbrica.
Ora, ecco dove la teoria incontra la realtà; un oggetto non può mai essere chiuso a tutti i tipi di modifica in ogni momento. Caso in questione, IFooObject è ora un oggetto codice aggiuntivo nel codebase, che deve cambiare ogni volta che cambia l'interfaccia richiesta dai consumatori o le implementazioni di IFooObjects. 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 più in profondità, se l'interfaccia stessa verrà sostituita da una nuova.
Un buon programmatore sa come bilanciare YAGNI ("Non ne avrai bisogno") con SOLID, analizzando il design e trovando luoghi che molto probabilmente dovranno cambiare in un modo particolare e riformattandoli per essere più tolleranti nei confronti di che tipo di cambiamento, perché in tal caso "tu sei andando bisogno".