我相信工厂方法设计模式适合我正在尝试做的事情,但我不确定赋予它多少责任(它创建的子类的知识)。在 Wikipedia上使用工厂方法模式的示例几乎完全描述了我所处的情况:
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
函数中的 进行检查并跳过 switch 案例呢?
我以前没有任何使用工厂的经验,我希望从过去使用过工厂的人那里获得一些关于处理这个问题的最佳方法的见解。让工厂知道其子类的内部工作是否可以,或者他们是否应该负责让工厂知道要创建哪个,以及如何组织它们?
谢谢!