1

ここに画像の説明を入力

この画像では、ファクトリが正しいオブジェクトを作成するのに役立ついくつかの定数がソース クラスに表示されます。これはアンチパターンであり、これらの定数を別のクラスに移動する必要があると言われました。それらをファクトリクラスに移動する必要がありますか?

Factory クラスのコードは次のとおりです。

class Factory
{
        public function make($format)
        {
                switch ($format)
                {
                        case Source::Assocs:
                                return new SourceFormatsAssocs();
                        case Source::XML:
                                return new SourceFormatsXML();
                        //Some more formats
                }
        }
}
4

2 に答える 2

2

これにより、基本クラスを変更せずに新しいサブクラスを追加することができなくなります (新しい定数を追加するため)。私は実際にそれを工場に移動します。ファクトリは、作成できるすべての種類のサブクラスを認識している必要があります。基本クラスは、そのサブクラスについて知る必要はありません。

さらに、これらの定数は、ファクトリ (およびファクトリの呼び出し元) によってのみ使用されます。基本クラスはそれらをまったく使用しません。

于 2013-02-08T23:49:17.427 に答える
1

より良いアイデアは、ビルダーを検討することです。なんで?Formats 型を知っている抽象クラスと、さまざまなサブタイプを構築する具体的な Builder を持つことができるためです。Builder は、いくつかのステップで複雑なものを作成する必要がある場合に行われることになっていますが、Bloch の静的ビルダーや流暢なビルダーのようなビルダー パターンのバリエーションがあり、パターンを使用して呼び出しを連鎖させます。コードが読みやすくなり、製品がインラインで生成されます。

別の可能性はFactory Methodです。自分のクラスが Builder に値するかどうかが気になる場合は、これが適している可能性があります。

于 2013-02-09T05:29:17.033 に答える