Лучший шаблон дизайна для следующего сценария - PullRequest
7 голосов
/ 13 ноября 2010

Я пытаюсь улучшить свой стиль кодирования.Рассмотрим следующий сценарий:
Предположим, я хочу определить пользовательский серверный элемент управления ASP.Net Album.Цель состоит в том, чтобы позволить пользователю выбрать тип альбома, и все остальные вещи будут выполняться элементом управления.
Я подумал о 2 подходах:

1- Определить интерфейс IAlbum и определить класс (который реализует IAlbum) для каждого типа альбома.Например:

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

Так что, если пользователь хочет альбом Flash, он должен явно создать объект FlashAlbum.что-то вроде:

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

Проблема в том, что я не хочу, чтобы пользователь имел дело с несколькими типами альбомов.Читайте ниже, чтобы понять, что я имею в виду.

2 - Определите IAlbum, определите класс (который реализует IAlbum) для каждого типа альбома (как и выше) и определите Album класс, который не реализовать IAlbum.Он используется для создания экземпляров альбома в его конструкторе (фабричный шаблон).Определите EnumAlbumTypes:

Public Enum AlbumTypes  
{  
    FlashAlbum,  
    JSAlbum  
}  

Теперь определите конструктор для родительского класса Album, который принимает параметр типа EnumAlbumTypes и создает соответствующий альбом на основе этого параметра.Я предпочитаю этот метод.Но я не очень знаком с заводским рисунком.Я хочу, чтобы пользователь создавал такие альбомы, как:

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

Каков наилучший подход для достижения этой цели?
Спасибо и простите за длинный пост.

Ответы [ 2 ]

4 голосов
/ 13 ноября 2010

Шаблон Factory является хорошим вариантом, если вы хотите инкапсулировать решение о конкретном типе создаваемого объекта. Метод create должен возвращать тип Album, поэтому он будет:

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

Если процесс создания альбомов существенно отличается, вы можете рассмотреть шаблон строителя. Это позволяет инкапсулировать сложную логику создания.

0 голосов
/ 13 ноября 2010

Если вы не хотите, чтобы пользователь заботился о том, какой у него альбом, то почему вы вообще предоставляете ему выбор?

Наследование кажется правильным выбором здесь. Я не вижу никаких доказательств или аргументов в пользу другого варианта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...