La moda del patrón Factory surge de una creencia casi dogmática entre los codificadores en lenguajes de "estilo C" (C / C ++, C #, Java) de que el uso de la palabra clave "nueva" es malo y debe evitarse a toda costa (o al menos centralizado). Esto, a su vez, proviene de una interpretación ultra estricta del Principio de Responsabilidad Única (la "S" de SÓLIDO) y también del Principio de Inversión de la Dependencia (la "D"). En pocas palabras, el SRP dice que, idealmente, un objeto de código debe tener una "razón para cambiar", y solo una; esa "razón para cambiar" es el propósito central de ese objeto, su "responsabilidad" en la base de código, y cualquier otra cosa que requiera un cambio en el código no debería requerir abrir ese archivo de clase. El DIP es aún más simple; un objeto de código nunca debería depender de otro objeto concreto,
Caso en cuestión, al usar "nuevo" y un constructor público, está acoplando el código de llamada a un método de construcción específico de una clase concreta específica. Su código ahora debe saber que existe una clase MyFooObject y tiene un constructor que toma una cadena y un int. Si ese constructor alguna vez necesita más información, todos los usos del constructor tienen que actualizarse para pasar esa información, incluida la que está escribiendo ahora, y por lo tanto, deben tener algo válido para transmitir, por lo que deben tener o cambiarlo para obtenerlo (agregando más responsabilidades a los objetos consumidores). Además, si MyFooObject alguna vez se reemplaza en la base de código por BetterFooObject, todos los usos de la clase anterior tienen que cambiar para construir el nuevo objeto en lugar del anterior.
Entonces, en cambio, todos los consumidores de MyFooObject deberían depender directamente de "IFooObject", que define el comportamiento de la implementación de clases, incluyendo MyFooObject. Ahora, los consumidores de IFooObjects no pueden simplemente construir un IFooObject (sin saber que una clase concreta en particular es un IFooObject, que no necesitan), por lo que deben recibir una instancia de una clase o método de implementación de IFooObject desde afuera, por otro objeto que tiene la responsabilidad de saber cómo crear el IFooObject correcto para la circunstancia, que en nuestro lenguaje generalmente se conoce como Fábrica.
Ahora, aquí es donde la teoría se encuentra con la realidad; un objeto nunca puede cerrarse a todo tipo de cambio todo el tiempo. Por ejemplo, IFooObject ahora es un objeto de código adicional en la base de código, que debe cambiar cada vez que cambie la interfaz requerida por los consumidores o las implementaciones de IFooObjects. Esto introduce un nuevo nivel de complejidad involucrado en cambiar la forma en que los objetos interactúan entre sí a través de esta abstracción. Además, los consumidores aún tendrán que cambiar, y más profundamente, si la interfaz en sí es reemplazada por una nueva.
Un buen programador sabe cómo equilibrar YAGNI ("No lo vas a necesitar") con SOLID, analizando el diseño y encontrando lugares que es muy probable que tengan que cambiar de una manera particular, y refactorizándolos para que sean más tolerantes a ese tipo de cambio, porque en ese caso "que está a necesitarlo".