0

新しいことを学び、最近この問題に遭遇したためだけに、独自の MVC フレームワークを作成しています。私がこのようなものを持っているとしましょう:

Class Post extends \application\BaseClass
{
    private $objPostDetail = null;
    private $objAuthor = null
    private $objCategory = null;
    private $objType = null;
    private $objTitlePicture = null;

    public function __construct(PostDetail $objPostDetail,
                                Author $objAuthor, 
                                Category $objCategory, 
                                Type $objType, 
                                TitlePicture $objTitlePicture)
    {
        $this->objPostDetail = $objPostDetail;
        $this->objAuthor = $objAuthor;
        $this->objCategory = $objCategory;
        $this->objType = $objType;
        $this->objTitlePicture = $objTitlePicture;
    }
}

次に、コンストラクターで使用される一部のオブジェクトも作成が複雑になる可能性があります。データの配列を返す PostDAO クラスからデータを取得します。問題は、このクラスの新しいインスタンスを作成する方法です。これは、アプリケーションの多くの場所にある可能性があるためです。どこでも $objAuthor を作成し、次に $objCategory などを作成して最終的に $objPost を作成するのは良くないと思います。そこで、Factory と呼ばれるものを作成しました。

Class PostFactory extends \application\BaseFactory
{
    private $arrData = null;
    private $objPostDetail = null;
    private $objCategory = null;
    private $objType = null;
    private $objTitlePicture = null;

    public function __construct($arrData)
    {
        $this->arrData = $arrData;
    }

    public function build()
    {
        $this->objPostDetail = $this->buildPostDetail();
        $this->objCategory = $this->buildCategory();
        $this->objType = $this->buildType();
        $this->objTitlePicture = $this->buildTitlePicture();

        return $this->buildPost();
    }

    private function buildPostDetail()
    {
        $objPostDetail = new \includes\classes\factories\PostDetailFactory($this->arrData);
        return $objPostDetail->build();
    }

    private function buildCategory()
    {
        $objCategory = new \includes\classes\factories\CategoryFactory($this->arrData);
        return $objCategory->build();
    }

    private function buildType()
    {
        $objType = new \includes\classes\factories\TypeFactory($this->arrData);
        return $objType->build();
    }

    private function buildTitlePicture()
    {
        $objTitlePicture = new \includes\classes\factories\TitlePictureFactory($this->arrData);
        return $objTitlePicture->build();
    }

    private function buildPost()
    {
        return new \includes\classes\Post($this->objPostDetail, $this->objCategory,
                        $this->objType, $this->objTitlePicture);
    }
}

それはうまく機能しますが、2倍のクラスがあるのは好きではありません.Factoryクラスに配列を渡すので、Postをインスタンス化するために必要なパラメーターがわかりません(コンストラクターで多くのパラメーターを避けたいため) )。だから、私の質問は、このようなクラスのインスタンスを作成する最良の方法は何ですか?

助けてくれてありがとう。

4

1 に答える 1