2010-11-13 15 views
7

Estoy intentando mejorar mi estilo de codificación. Tenga en cuenta la situación siguiente:
Supongamos que quiero definir un control de servidor de Álbum ASP.Net personalizado. El objetivo es permitir que el usuario elija el tipo de álbum y todo lo demás se llevará a cabo por el control.
He pensado en 2 enfoques:Mejor patrón de diseño para el siguiente escenario

1- Defina una interfaz IAlbum y defina una clase (que implementa IAlbum) para cada tipo de Álbum. Por ejemplo:

public class FlashAlbum : IAlbum 
    { 
    // Implement IAlbum Methods... 
    // FlashAlbum-Specific Properties/Methods. 
    } 
    public class JSAlbum : IAlbum 
    { 
    // Implement IAlbum Methods... 
    // JSAlbum-Specific Properties/Methods. 
    } 

Por lo tanto, si el usuario desea un álbum flash, debe crear explícitamente un objeto FlashAlbum. algo como:

var myFlashAlbum = new FlashAlbum(/*FlashAlbumParameters*/); 
var myJSAlbum = new JSAlbum(/*JSAlbumParameters*/); 

El problema es que no quiero que el usuario tenga que ocuparse de varios tipos de álbumes. Lea a continuación para entender a qué me refiero.

2- Definir iAlbum, definir una clase (que implementa iAlbum) para cada tipo Album (igual que anteriormente) y definen Album clase que no implemento iAlbum. Se usa para crear instancias de álbum en su contructor (patrón de fábrica). Definir EnumAlbumTypes:

Public Enum AlbumTypes 
{ 
    FlashAlbum, 
    JSAlbum 
} 

Ahora definir un constructor de la clase padre del álbum que toma el parámetro de tipo EnumAlbumTypes y crea el álbum correspondiente en función del parámetro. Yo prefiero este método Pero no estoy muy familiarizado con el patrón de fábrica. Quiero que el usuario cree álbumes como:

var myFlashAlbum = new Album(AlbumTypes.FlashAlbum); 
// Now set FlashAlbum custom properties. 
var myJSAlbum = new Album(AlbumTypes.JSAlbum); 
// Now set JSAlbum custom properties. 

¿Cuál es el mejor enfoque para lograrlo?
Gracias y lo siento por la larga publicación.

+0

Parece que responde su propia pregunta. El patrón de fábrica parece responder mejor a su expectativa de que el usuario no tenga que tratar con múltiples tipos de álbumes al encapsular la creación de un tipo específico. ¿Qué preocupaciones tienes sobre la implementación de este patrón? –

+1

Como puede ver en mi código, estaba llamando incorrectamente a la clase de fábrica principal. 'nuevo álbum (AlbumType.FlashAlbum)' es correcto. Debería llamarlo así: 'AlbumFactory.Create (AlbumType.FlashAlbum)'. PD Como soy nuevo en el uso de patrones de diseño, quería asegurarme de estar en el camino correcto. – Kamyar

Respuesta

4

El patrón de fábrica es una buena opción cuando desea encapsular la decisión sobre el tipo específico de objeto para crear. El método debe devolver crear un tipo de álbum, así que será:

var myFlashAlbum = Album.create(AlbumTypes.FlashAlbum); 
    var myJSAlbum = Album.create(AlbumTypes.JSALbum); 

Si el proceso de construcción de los álbumes son significativamente diferentes es posible que desee considerar el Builder. Le permite encapsular la compleja lógica de creación.

+0

¡Gracias! patrón de constructor parece interesante. – Kamyar

+1

las "var" s también podrían ser reemplazadas por IAlbum. – Philipp

0

Si no desea que el usuario se preocupe por el tipo de álbum que tiene, ¿por qué le da la posibilidad de elegir?

La herencia parece ser la elección correcta aquí. No veo ninguna evidencia o argumento a favor de la otra opción.

+0

Quiero que el usuario tenga UN objeto y pueda cambiar el estilo de ESE Álbum. no crear un objeto de otro tipo. – Kamyar

Cuestiones relacionadas