El patrón de fábrica no es intrínsecamente un infractor de OCP.
Depende de cómo sigue el comportamiento de Complex
.
Si Complex
se requiere para apoyar la producción de nuevos tipos de Complex
objeto y elige modificar Complex
mediante la adición de nuevos fromX
métodos se añaden a apoyarlos, entonces esto significa que Complex
se convierte en un violador de la necesidad OCP porque Complex
se volvió a abrir para la modificación:
class Complex
{
public static Complex fromCartesian(double real, double imag) {
return new Complex(real, imag);
}
public static Complex fromPolar(double modulus, double angle) {
return new Complex(modulus * cos(angle), modulus * sin(angle));
}
//class opened for modification
public static Complex fromOtherMeans(String x , String y) {
return new Complex(x, y);
}
}
se podría empujar a este problema hacia abajo en un archivo de texto o archivo de propiedades de algún tipo con el fin de absolver a sí mismo de tener que cambiar la clase de java, pero no impide que de tener que escribir una lógica extra en esta área de la solución en ord er para admitir nuevos tipos de Complex
.
Dependiendo del uso de Complex
en su diseño (¿cómo son diferentes los tipos? ¿Cómo los está utilizando?), Hay algunas opciones alternativas que pueden aplicarse bien.
Uno de estos OCP alternativa amigable es la subclase Complex
para proporcionar los métodos de fábrica adicionales. Una subclase es la ilustración más simple de cómo se extiende Complex
pero no se modifica.
Otro OCP alternativa amigable a la alteración de Complex
en este caso es el Decorator pattern. La decoración continua de Complex
con la capacidad de crear nuevas variantes de Complex
respeta el OCP porque Complex
no se modifica, pero se amplía envolviéndola con una nueva funcionalidad.
Una tercera alternativa podría ser alterar la estructura de Complex
para que su cálculo sea proporcionado por la composición. Esto le abriría la oportunidad de usar el Strategy pattern para diferenciar entre los diferentes comportamientos de Complex
.
Lo que pasa con el patrón de fábrica es que ayuda al código de contexto respecto OCP. Se puede emplear una de las técnicas anteriores para permanecer en el lado derecho del OCP con su clase Factory, pero es probable que sus colegas echen un vistazo al gráfico de objetos, cuestionen la sabiduría de tener un gráfico de objetos sobre una sola fábrica. , y simplifíquelo de nuevo en una Fábrica, lo que lo regresa al primer ejemplo.
En tales casos, en lugar de intentar doblar la implementación del patrón de la fábrica de respetar los principios SOLID, considerar por qué se está usando en absoluto .
Me gustaría saber qué piensas de esto antes de responder. Su respuesta me hará sentir que está buscando la respuesta. De lo contrario, es como si estuvieras externalizando tu trabajo a SO. –
Disculpa, estaba planeando agregar un comentario, pero se desvió del trabajo. :) Estoy pensando que lo viola. Corrígeme si me equivoco, pero FMP dictamina un constructor privado y un constructor privado prohíbe la extensión. Además, ¿no tendría que modificarse la clase para admitir implementaciones alternativas? Estoy pensando en la situación en que una clase tiene métodos de fábrica estáticos. Tal vez este es solo un sabor de FMP? –
Si es una clase secundaria, puedes sobreescribir el método o usar super() (asumiendo Java). Es mejor que no tenga métodos estáticos y tenga un único método que tome parámetros sobre cuál elegir con una declaración de cambio o leyendo en un archivo de configuración proporcionado. –