ファクトリ メソッドの設計パターンは、私がやろうとしていることには適していると思いますが、どの程度の責任 (それが作成するサブクラスの知識) を与えるべきかわかりません。ウィキペディアでファクトリ メソッド パターンを使用する例は、私がいる状況をほぼ正確に説明しています。
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
関数がどのように見えるかです。この特定の例では、ファイル ヘッダーをチェックして、データがどの画像形式であるかを判断すると仮定します。ファイル ヘッダーを解析し、ファイル タイプが GIF か JPEG かを判断する方法を自身が知っているかどうかInputStream
を知りたいです。ImageReaderFactory
など、または各クラス内で関数を呼び出して、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 ケースをスキップしないからです。
私は以前にファクトリを使用した経験がありませんでした。この問題を処理するための最善の方法について、過去にファクトリを使用したことがある人から洞察を得たいと思っていました。サブクラスの内部動作についてファクトリに知らせても問題ないでしょうか?それとも、どのサブクラスを作成するか、およびどのようにすべてを編成するかをファクトリに知らせる責任がありますか?
ありがとう!