En este ejemplo se devuelve un objeto de tipo Mac
y nunca puede ser algo diferente:
$mac = new Mac();
No puede ser una subclase de Mac
, no puede ser de una clase que coincide con la interfaz de Mac
.
Considerando que el ejemplo siguiente puede devolver un objeto de tipo Mac
o cualquier otro tipo que la fábrica decida es apropiado.
$appleStore = new AppleStore();
$mac = $appleStore->getProduct('mac');
Es posible que desee un conjunto de subclases de Mac
, cada uno representando un modelo diferente de Mac. Luego, escribe el código en la fábrica para decidir cuál de estas subclases usar. No puede hacer eso con el operador new
.
Así que una fábrica le da más flexibilidad en la creación de objetos. La flexibilidad a menudo va de la mano con el desacoplamiento.
Re tu comentario: Yo no diría que no uso new
. De hecho, utilizo new
para la mayoría de la creación de objetos simples. Pero no tiene nada que ver con quién escribe el código del cliente. El patrón de fábrica es para cuando desea una arquitectura que puede elegir la clase para instanciar dinámicamente.
En su ejemplo de Apple Store, es probable que desee un código simple para instanciar un producto y agregarlo a un carrito de compras. Si usa new
y tiene diferentes tipos de objetos para cada tipo de producto diferente, tendrá que escribir una declaración enorme case
para que pueda crear un objeto new
del tipo apropiado. Cada vez que agregue un tipo de producto, deberá actualizar esa declaración case
. Y es posible que tenga varias de estas declaraciones case
en otras partes de su aplicación.
Al usar una fábrica, solo tendría un lugar para actualizar, que sabe cómo tomar un parámetro y crear instancias del tipo correcto de objeto. Todos los lugares de su aplicación obtendrían soporte implícito para el nuevo tipo, sin necesidad de cambios de código. Este es un triunfo ya sea que usted sea el único desarrollador o si está en un equipo.
Pero una vez más, no necesita una fábrica si no necesita admitir una variedad de subtipos. Simplemente continúe usando new
en casos simples.
¿Ese segundo parece más una relación que una fábrica para mí ...? – SeanJA