Credo che il modello di progettazione del metodo factory sia appropriato per quello che sto cercando di fare, ma non sono sicuro di quanta responsabilità (conoscenza delle sottoclassi create) a darlo. L'esempio di utilizzo del factory method pattern su Wikipedia descrive la situazione in cui mi trovo in quasi esattamente:Come fa una fabbrica a sapere quale tipo di oggetto creare?
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.
}
}
}
La mia domanda è, cosa fa la funzione figureOutImageType
assomiglia? In questo specifico esempio, presumo che controlli un'intestazione di file nello InputStream
per determinare in quale formato di immagine si trovano i dati. Vorrei sapere se lo ImageReaderFactory
sa come analizzare le intestazioni di file e determinare se il tipo di file è GIF , JPEG, ecc. O se chiama una funzione all'interno di ciascuna classe Reader
che consente di sapere quale tipo di immagine è. Qualcosa di simile, forse:
int figureOutImageType(InputStream is)
{
if(GifReader.isGIF(is))
return ImageReaderFactory.GIF;
else if(JpegReader.isJPEG(is))
return ImageReaderFactory.JPEG;
// etc.
}
Sembra come avere la fabbrica sa come analizzare le immagini si rompe l'incapsulamento, e lasciando che le sottoclassi decidere quale dovrebbe essere creato fa parte del modello di progettazione metodo factory. Tuttavia, sembra anche che la funzione figureOutImageType
stia semplicemente aggiungendo del codice ridondante, perché perché non ogni sottoclasse esegue il proprio controllo su InputStream
nella funzione getImageReader
e salta il caso di commutazione?
Non ho mai avuto esperienze con le fabbriche prima e speravo di ottenere alcune informazioni da alcune persone che li hanno usati in passato sul modo migliore per gestire questo problema. Va bene che la fabbrica sia a conoscenza del funzionamento interno delle sue sottoclassi o dovrebbe essere responsabile di far sapere alla fabbrica quale creare e come organizzarlo?
Grazie!
Eccellente, ben ponderata e formulata domanda. +1, di più se fosse possibile solo! – hmcclungiii
concordato. Ottima domanda – Ankur