Я считаю, что шаблон шаблона фабричного метода подходит для того, что я пытаюсь сделать, но я не уверен, сколько ответственности (знаний о подклассах, которые он создает), чтобы дать его. Пример использования factory method pattern в Википедии описывает ситуацию, я почти точно:Как фабрика знает, какой тип объекта создать?
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
и пропустить регистр коммутатора?
У меня не было опыта использования фабрик раньше, и я надеялся получить некоторое представление от некоторых людей, которые использовали их в прошлом, чтобы наилучшим образом справиться с этой проблемой. Хорошо ли знать фабрику о внутренних разработках своих подклассов или они должны нести ответственность за то, чтобы дать фабрике знать, что создавать, и как вы ее организуете?
Спасибо!
Отлично, хорошо продуманный и сформулированный вопрос. +1, больше, если это было возможно! – hmcclungiii
Согласовано. Отличный вопрос. – Ankur