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