3

ファクトリ メソッドのパターンがわかりません。ここの例から: http://worldwardiary.com/history/Factory_method_pattern#Using_the_factory_patternとここ: https://stackoverflow.com/a/806942/2420939 :

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.
        }
    }
}

getImageReader() と GifReader クラスの「<<」メソッドのどちらが事実上の「ファクトリ メソッド」ですか?

4

2 に答える 2

3

簡単に言えば、ファクトリ メソッドはオブジェクトの作成をカプセル化します。彼らはあなたのために複雑なオブジェクトを作成するので、あなたは気にする必要はありません。

あなたの例では:

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.
        }
    }
}

オブジェクトを作成しImageReader(コンストラクターを呼び出して)、それらを返すのは誰ですか? どちらも、クラスfigureOutImageType()のメソッド(または他のもの、または場合によっては , , ...)。GifReaderJpegReaderPngReaderTiffReaderetcReader

最終的getImageReader()は、あなたのためにそれらを作成しています. これは、 「ねえ、私に を作成してImageReaderください」と尋ねるメソッドであり、残りは実行します。

したがって、せいぜい、public static ImageReader getImageReader(InputStream is) {}ファクトリ メソッドに最も近い (以下の更新を参照)。



アップデート:

この設計は厳密には「ファクトリー メソッド パターン」ではないことに注意してください。これは、その変形として提示されます。

この理由は他の回答で説明されているので、ここで 1 つだけ引用させてください(わずかに改作):

(...) このスニペットは「Factory Method OO Design Pattern」の適切な実装ではありません。これは、「クラスがインスタンス化をサブクラスに委ねる」を満たしていないためです。ただし、個人的には、このソリューションを「ファクトリーメソッド」と自由に呼んでいます。
実際ファクトリ メソッド パターンにするには、メソッドをサブクラスでオーバーライドできるようにする必要があります。つまり、ファクトリ クラス ( ImageReaderFactory) は拡張可能 (つまり、非static) である必要があり、そうでgetImageReaderある必要がありますabstract

于 2013-05-25T20:24:14.447 に答える