2010-11-13 14 views
7

Próbuję poprawić mój styl kodowania. Rozważmy następujący scenariusz:
Załóżmy, że chcę zdefiniować niestandardowy kontroler serwera Albumu ASP.Net. Celem jest umożliwienie użytkownikowi wyboru rodzaju albumu, a wszystkie inne rzeczy zostaną wykonane przez kontrolę.
Myślałem o 2 podejściach:Najlepszy wzór dla następnego scenariusza

1 Zdefiniuj interfejs IAlbum i zdefiniuj klasę (która implementuje IAlbum) dla każdego typu albumu. Na przykład:

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

Jeśli użytkownik chce mieć album flash, powinien jawnie utworzyć obiekt FlashAlbum. coś takiego:

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

Problem polega na tym, że nie chcę, aby użytkownik miał do czynienia z wieloma typami albumów. Przeczytaj poniżej, aby zrozumieć, co mam na myśli.

2- zdefiniować iAlbum, definiować klasę (który realizuje iAlbum) dla każdego typu albumu (jak wyżej) i określenie klasy, które Album nie implementuje iAlbum. Służy do tworzenia instancji albumu w swoim contructor (wzór fabryczny). Definiowanie EnumAlbumTypes:

Public Enum AlbumTypes 
{ 
    FlashAlbum, 
    JSAlbum 
} 

teraz zdefiniować konstruktora dla klasy dominującej album, który przybiera parametr typu EnumAlbumTypes i tworzy odpowiedni album w oparciu o parametr. Wolę tę metodę. Ale nie jestem bardzo zaznajomiony z wzorcem fabrycznym. Chcę, aby użytkownik utworzył albumy takie jak:

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

Jakie jest najlepsze podejście, aby to osiągnąć?
Dzięki i przepraszam za długi post.

+0

Wydaje się, że odpowiadasz na własne pytanie. Wydaje się, że wzór fabryczny lepiej odpowiada oczekiwaniom użytkownika, że ​​użytkownik nie musi zajmować się wieloma typami albumów poprzez hermetyzację tworzenia określonego typu. Jakie masz obawy dotyczące wdrożenia tego schematu? –

+1

Jak widać w moim kodzie, nieprawidłowo wywoływałam główną klasę fabryczną. 'new Album (AlbumType.FlashAlbum)' jest poprawny. Powinienem nazywać to tak: 'AlbumFactory.Create (AlbumType.FlashAlbum)'. P.S. Ponieważ jestem nowy w używaniu wzorców projektowych, chciałem się upewnić, że jestem na dobrej drodze. – Kamyar

Odpowiedz

4

Wzór fabryczny jest dobrym rozwiązaniem, gdy chcesz zawrzeć decyzję dotyczącą określonego typu obiektu do utworzenia. Sposób tworzenia powinien wrócić typ albumu tak będzie:

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

Jeśli proces konstruowania albumy różnią się istotnie może warto rozważyć wzór budowniczym. Umożliwia enkapsulację złożonej logiki tworzenia.

+0

Dzięki! wzór budowniczy wydaje się interesujący. – Kamyar

+1

"var" może również zostać zastąpiony przez IAlbum. – Philipp

0

Jeśli nie chcesz, aby użytkownik dbał o to, jaki ma album, to dlaczego dajesz im wybór?

Dziedziczenie wydaje się być właściwym wyborem. Nie widzę żadnych dowodów ani argumentów na rzecz drugiej opcji.

+0

Chcę, aby użytkownik miał JEDEN obiekt i mógł zmienić styl TEGO albumu. nie tworzyć obiektu innego typu. – Kamyar

Powiązane problemy