Я считаю, что шаблон дизайна метода factory подходит для того, что я пытаюсь сделать, но я не уверен, сколько ответственности (знание подклассов, которые он создает), чтобы дать его. Пример использования шаблона factory в Википедии описывает ситуацию, в которой я почти точно:
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.
}
Кажется, что factory умеет разбирать инкапсуляцию разрывов изображений и позволяет подклассам решать, какой из них нужно создать, является частью шаблона проектирования метода factory. Тем не менее, также кажется, что функция figureOutImageType
просто добавляет некоторый избыточный код, потому что почему бы не просто выполнить каждый подкласс в InputStream
в функции getImageReader
и пропустить регистр коммутатора?
У меня не было опыта использования фабрик раньше, и я надеялся получить некоторое представление от некоторых людей, которые использовали их в прошлом, чтобы наилучшим образом справиться с этой проблемой. Можно ли знать factory о внутренних функциях своих подклассов или они должны нести ответственность за то, чтобы сообщить factory, что создавать и как вы его организуете?
Спасибо!