2009-09-15 15 views
7

Me preguntaba si existe un patrón opuesto al patrón de fábrica. Por ejemplo, cuando un determinado objeto necesita ser eliminado, se necesita realizar un trabajo extra para deshacer la configuración que se realizó en el objeto de fábrica.¿Qué patrón de diseño es el opuesto al patrón de fábrica?

La ampliación del objeto de fábrica con un método Delete, por ejemplo, parece incorrecta, ya que el patrón de fábrica es un patrón de creación estricto.

Actualización: La razón por la que estoy usando una fábrica es porque la configuración que hay que hacer introduciría algunas dependencias al objeto que no encajarían. Poner esta desconfiguración en el constructor plantearía el mismo problema.

+2

¿Qué quiere decir exactamente con 'eliminar'? ¿Liberarse de la memoria o eliminar de un almacén de datos? –

+0

Con la eliminación quise eliminarlo de un almacén de datos, esto sería hecho por el repositorio. –

+0

y qué tipo de "configuración se realizó en el objeto de fábrica"? Un objeto debería ser capaz de limpiar por sí mismo, la tarea de destructores y/o disponer. Yo diría que una fábrica no debería saber nada de los objetos que ha creado. –

Respuesta

3

Esa es la forma correcta de usar fábrica. Factory no solo es una forma de crear objetos, sino también la forma de decir: necesito una inicialización especial para este tipo de objetos. Con su problema, creo que la mejor solución sería notificar a la fábrica con algún evento, como desechado. Por lo tanto, la creación de objetos se realizará de la siguiente manera: crear, suscribir fábrica al evento del objeto recién creado. Cada vez que se elimine un objeto, notificará a la fábrica sobre eso y realizará las acciones que necesite.

Si no le gusta poner esto en la fábrica, puede delegarlo en algún otro objeto, como DeathKeeper ;-). Por lo que su código será sometihng así:

//Inside factory create method 
MyObject obj = GetNewInitializedObject(); 
_detahKeeper.RegisterObject(obj); 

return obj; 

Ahora cada vez que tendrá que eliminar objeto, el objeto notificará arquero muerte y haría que toda la lógica disponer. Por cierto, no sé cómo funciona todo, pero puede usar la interfaz IDisposable para hacer la lógica personalizada para deshacerse de los recursos que tiene el objeto. La decisión depende de qué hay en su proyecto y depende de usted.

4

Un repositorio puede usarse para eliminar un objeto persistente, o puede usar el método de eliminación para realizar una limpieza en un objeto en memoria solamente.

+0

Voy a poner esta "desconfiguración" en el repositorio por ahora. –

+0

¿Necesita destruir cualquier información persistente (base de datos/archivo)? –

2

Puedo usar un patrón de "Reciclaje Fondo para" trabajar en conjunto con la fábrica:

  • tienen un método "limpio" para cada clase que puede ser reciclado
  • tienen un "identificador único" para cada objeto instancia

Cada vez que un objeto llega al final de su vida útil, enviarlo a la "planta de reciclaje" (RF):

  • El RF almacena el objeto de acuerdo con alguna política (p. mantener únicos casos X de la clase Y)
  • Cuando se requiere una instancia de la clase Y, la Fábrica "pide" la RF si su conseguido una
    • si el RF tiene uno a mano, la RF llama la "limpia()" método de la instancia y la devuelve a la fábrica

... y así sucesivamente así sucesivamente.

Espero que esto ayude.

Cuestiones relacionadas