2010-11-13 15 views
7

J'essaie d'améliorer mon style de codage. Considérez le scénario suivant:
Supposons que je veux définir un contrôle de serveur d'album ASP.Net personnalisé. Le but est de laisser l'utilisateur choisir le type d'album et toutes les autres choses seront effectuées par le contrôle.
J'ai pensé à 2 approches:Meilleur motif de conception pour le scénario suivant

1- Définissez une interface IAlbum et définissez une classe (qui implémente IAlbum) pour chaque type d'album. Par exemple:

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

Si l'utilisateur souhaite un album flash, il doit explicitement créer un objet FlashAlbum. quelque chose comme:

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

Le problème est que je ne veux pas que l'utilisateur ait à gérer plusieurs types d'albums. Lire ci-dessous pour comprendre ce que je veux dire.

2- Définir iAlbum, définir une classe (qui met en œuvre iAlbum) pour chaque type album (comme ci-dessus) et définissent Album classe qui ne pas mettre en œuvre iAlbum. Il est utilisé pour créer des instances d'album dans son constructeur (modèle d'usine). Définir EnumAlbumTypes:

Public Enum AlbumTypes 
{ 
    FlashAlbum, 
    JSAlbum 
} 

définissent maintenant un constructeur de la classe Album parent qui prend le un paramètre de type EnumAlbumTypes et crée l'album approprié en fonction du paramètre. Je préfère cette méthode. Mais je ne suis pas très familier avec le modèle d'usine. Je veux que l'utilisateur crée des albums comme:

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

Quelle est la meilleure approche pour y parvenir?
Merci et désolé pour le long post.

+0

Vous semblez répondre à votre propre question. Le modèle d'usine semble mieux répondre à vos attentes que l'utilisateur n'a pas à gérer plusieurs types d'albums en encapsulant la création d'un type spécifique. Quelles préoccupations avez-vous de mettre en œuvre ce modèle? –

+1

Comme vous pouvez le voir dans mon code, j'appelais incorrectement la classe d'usine principale. 'new Album (AlbumType.FlashAlbum)' est correct. Je devrais l'appeler comme: 'AlbumFactory.Create (AlbumType.FlashAlbum)'. P.S. Depuis que je suis nouveau à l'aide de modèles de conception, je voulais m'assurer que je suis sur le bon chemin. – Kamyar

Répondre

4

Le motif Factory est une bonne option lorsque vous souhaitez encapsuler la décision concernant le type spécifique d'objet à créer. La méthode de création doit retourner un type album il sera:

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

Si le processus de construction des albums sont sensiblement différents, vous voudrez peut-être considérer le modèle de constructeur. Il vous permet d'encapsuler la logique de création complexe.

+0

Merci! modèle de constructeur semble intéressant. – Kamyar

+1

les "var" pourraient également être remplacés par IAlbum. – Philipp

0

Si vous ne voulez pas que l'utilisateur se soucie du type d'album qu'il possède, alors pourquoi lui donnez-vous le choix?

L'héritage semble être le bon choix ici. Je ne vois aucune preuve ou argument en faveur de l'autre option.

+0

Je veux que l'utilisateur possède un seul objet et puisse changer le style de THAT Album. ne pas créer un objet d'un autre type. – Kamyar