Creo que el patrón de diseño de método de fábrica es apropiado para lo que estoy tratando de hacer, pero no estoy seguro de cuánta responsabilidad (conocimiento de las subclases crea) para darle. El ejemplo del uso del factory method pattern en Wikipedia describe la situación que estoy en casi exactamente:¿Cómo sabe una fábrica qué tipo de objeto crear?
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.
}
}
}
Mi pregunta es, ¿qué aspecto tiene la función figureOutImageType
como? En este ejemplo específico, supongo que comprueba un encabezado de archivo en el InputStream
para determinar en qué formato de imagen están los datos. Me gustaría saber si el ImageReaderFactory
sabe cómo analizar los encabezados de los archivos y determinar si el tipo de archivo es GIF. , JPEG, etc., o si llama a una función dentro de cada clase Reader
que le permite saber qué tipo de imagen es. Algo como esto, tal vez:
int figureOutImageType(InputStream is)
{
if(GifReader.isGIF(is))
return ImageReaderFactory.GIF;
else if(JpegReader.isJPEG(is))
return ImageReaderFactory.JPEG;
// etc.
}
Parece como tener la fábrica sabe cómo analizar imágenes se rompe la encapsulación, y dejar que las subclases decidir qué se debe crear uno es parte del patrón de diseño método de fábrica. Sin embargo, también parece que la función figureOutImageType
simplemente agrega algún código redundante, porque ¿por qué no simplemente hacer que cada subclase realice su verificación en el InputStream
en la función getImageReader
y omita la caja del interruptor?
No he tenido ninguna experiencia en el uso de fábricas antes, y esperaba obtener alguna información de algunas personas que los han utilizado en el pasado sobre la mejor manera de manejar este problema. ¿Está bien que la fábrica sepa sobre el funcionamiento interno de sus subclases, o deberían ser los responsables de dejar que la fábrica sepa qué crear, y cómo lo organizas todo?
Gracias!
Excelente, bien pensada y formulada pregunta. +1, ¡más si solo fuera posible! – hmcclungiii
De acuerdo. Excelente pregunta – Ankur