Я считаю, что шаблон проектирования фабричных методов подходит для того, что я пытаюсь сделать, но я не уверен, какую ответственность (знания о подклассах, которые он создает) возложить на него. Пример использования шаблона фабричных методов в Википедии почти точно описывает ситуацию, в которой я нахожусь:
public class ImageReaderFactory
{
public static ImageReader getImageReader( InputStream is )
{
int imageType = figureOutImageType( is );
switch( imageType )
{
case ImageReaderFactory.GIF:
return new GifReader( is );
case ImageReaderFactory.JPEG:
return new JpegReader( is );
// etc.
}
}
}
Мой вопрос: как выглядит функция figureOutImageType
? В этом конкретном примере я бы предположил, что он проверяет заголовок файла в InputStream
, чтобы определить, в каком формате изображения находятся данные. Я хотел бы знать, знает ли сам ImageReaderFactory
, как анализировать заголовки файлов и определять, является ли тип файла GIF , JPEG и т. д., или если он вызывает функцию внутри каждого класса Reader
, которая позволяет ему узнать, какой это тип изображения. Что-то вроде этого, может быть:
int figureOutImageType(InputStream is)
{
if(GifReader.isGIF(is))
return ImageReaderFactory.GIF;
else if(JpegReader.isJPEG(is))
return ImageReaderFactory.JPEG;
// etc.
}
Похоже, что наличие у фабрики знаний о том, как анализировать изображения, нарушает инкапсуляцию, и разрешение подклассам решать, какой из них должен быть создан, является частью шаблона проектирования фабричного метода. Тем не менее, также кажется, что функция figureOutImageType
просто добавляет некоторый избыточный код, потому что почему бы каждому подклассу просто не выполнить проверку InputStream
в функции getImageReader
и пропустить случай переключения?
Раньше у меня не было опыта использования фабрик, и я надеялся получить некоторое представление от некоторых людей, которые использовали их в прошлом, о наилучшем способе решения этой проблемы. Нормально ли, чтобы фабрика знала о внутренней работе своих подклассов, или они должны нести ответственность за то, чтобы фабрика знала, что создавать, и как вы все это организуете?
Спасибо!