0

Factory Methodパターンを実装していましたが、いくつかの例をチェックして、抽象クラスまたはインターフェースを作成する代わりに製品の具象クラスを拡張することが正しいかどうかを判断できませんでした...これは単なる例です(PHP) .

したがって、抽象ファクトリとその具体的なファクトリがあります。

interface BookFactoryInterface
{
    public function createBook();
}

class ElectronicBookFactory implements BookFactoryInterface
{
    public function createBook()
    {
        return new ElectronicBook();
    }
}

class PaperBookFactory implements BookFactoryInterface
{
    public function createBook()
    {
        return new PaperBook();
    }
}

すべての例で見たのは、通常、製品は抽象クラスまたはインターフェースから拡張されているということですが、テストを行っているときに、私の場合はその必要がないことに気付きました。必要なのは、一般的な動作と残りのサブクラス。

class Book
{
    /* 
      All properties like title, authors, publicationDate
      here, with the corresponding methods.
    */
}

class ElectronicBook extends Book
{
    //...
}

class PaperBook extends Book
{
    //...
}

クラスのインスタンス化はまだサブクラスに派生しているため、これはファクトリ メソッドの実装であると本当に信じていましたが、この方法で別のサンプル コードを見つけることができました。

質問: これはまだファクトリ メソッドの実装ですか? そうでない場合はなぜですか?

4

2 に答える 2

1

具体的なオブジェクトを作成するためのコードを変更する必要がある場合、(インターフェイスまたは抽象クラスを使用して) 抽象化する必要があります。これは、単体テストの作成中や、製品 (および/および) 作成者をさらに追加する必要がある場合などの状況が発生した場合に特に役立ちます。

factory と factory method に違いがあることを知るのは興味深いことです。ファクトリは、作成部分を処理するメソッドを持つクラスに作成部分をカプセル化する方法です。一方、ファクトリメソッドは、「製品」を作成するために「作成者」に与えられ、作成者が決定できます。製品を作成するメソッド、たとえば createProduct() は、通常、Creator の内部にあり (継承を使用して誘導されます)、他のメソッドの意図は通常、Factory メソッドによって作成された製品で動作することです。

現在、クリエーターとプロダクトの両方で、並行して階層を使用しているため、クリエーターは具体的なプロダクトに依存せず (または、プロダクトがどのように作成されているかを知らず)、プロダクトもクリエーターを認識していません。これは、疎結合コードの実現に役立ちます (ここでは、CHANGE は互いに影響しません)。

お役に立てれば。

詳細については、次を参照してください。

于 2015-09-08T18:02:44.817 に答える
0

これは非常に主観的ですが、ファクトリ メソッドであるために継承は必要ないと主張します。これは、定義を満たすのに実際には十分です。

class Book { 

}

class BookFactory {

   function createBook() {

     return new Book();    

   }

}
于 2015-09-07T15:30:45.217 に答える