La moda de patrones de Factory se deriva 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 "new" 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 SOLID), y también del Principio de Inversión de Dependencia (la "D"). Dicho de manera simple, el SRP dice que, idealmente, un objeto de código debería tener una "razón para cambiar", y una única; ese "motivo para cambiar" es el propósito central de ese objeto, su "responsabilidad" en el código base, y cualquier otra cosa que requiera un cambio en el código no debería requerir la apertura de ese archivo de clase. El DIP es aún más simple; un objeto de código nunca debe depender de otro objeto concreto, sino de una abstracción.
Caso en cuestión, al utilizar "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 deben actualizarse para pasar esa información, incluida la que está escribiendo ahora, y por lo tanto, deben tener algo válido para transmitir, y por lo tanto deben tener o cambiarlo para obtenerlo (agregar más responsabilidades a los objetos consumidores). Además, si MyFooObject se reemplaza alguna vez en el código base por BetterFooObject, todos los usos de la clase antigua deben cambiarse para construir el nuevo objeto en lugar del antiguo.
Entonces, en cambio, todos los consumidores de MyFooObject deben depender directamente de "IFooObject", que define el comportamiento de las clases de implementación, incluido MyFooObject. Ahora, los consumidores de IFooObjects no pueden simplemente construir un IFooObject (sin tener el conocimiento de que una clase concreta particular es un IFooObject, que no necesitan), por lo tanto, se les debe dar una instancia de una clase o método de implementación de IFooObject desde el exterior, por otro objeto que tiene la responsabilidad de saber cómo crear el objeto IFooObject correcto para la circunstancia, que en nuestro lenguaje generalmente se conoce como una Fábrica.
Ahora, aquí es donde la teoría se encuentra con la realidad; un objeto no puede nunca estar cerrado a todos los tipos de cambio todo el tiempo. En este caso, IFooObject es ahora un objeto de código adicional en el código base, que debe cambiar cada vez que cambie la interfaz requerida por los consumidores o las implementaciones de IFooObjects. Eso 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 todavía 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 refactorizando para que sean más tolerante a ese tipo de cambio, porque en ese caso "usted es lo va a necesitar".