2016-11-07 5 views
1

記事を構築するシステムがあるとします。これらがなければさまざまなコンポーネント/モジュールに工場パターンを使用する

$title = 'title'; 
    $description = 'Description in html'; 

    //Cleaner just clean some things from each field. 
    $cleaner = new Cleaner(); 

    //Validator throw exception if something is not correct 
    $validator = new Validator(); 

    // Storage save files and article itself 
    $storage = new Storage(); 

    //Dom Class get some files from description field 
    $dom = new Dom(); 
    $files = $dom->getFiles($description); 

    $storage->files($files); 

    $article = new ArticleBuilder(); 
    $article->addTitle($validator->title($cleaner->title($title))); 
    $article->addDescription($validator->description($cleaner->description($description))); 
    $article->add.... 

それが記事を構築することは不可能です:記事は、私は、各コンポーネントをインスタンス化する必要がある記事を構築するために、クライアントでは....いくつかのコンポーネントのバリデータ、クリーナー、ストレージを持っています。

私の質問は: が、私はこのように、これらのすべてを作成するためにファクトリパターンを使用することができます。クライアントでは

  class ArticleFactory 
     { 
      private $article; 

      public function __construct() 
      { 
       $this->article = new ArticleBuilder(); 
      } 

      public function setTitle(string $title) 
      { 
       $title = ($this->validator())->title($title); 
       $title = ($this->cleaner())->title($title); 
       $this->article->addTitle($title); 
      } 

      public function setDescription(string $des) 
      { 
       $des = ($this->validator())->title($des); 
       $des = ($this->cleaner())->title($des); 
       $this->article->addDescription($des); 
      } 

      public function getArticle(): ArticleBuilder 
      { 
       return $this->article; 
      } 

      public function getFiles($description) 
      { 
       return ($this->dom())->getFiles($description); 
      } 

      public function storeFile($files) 
      { 
       ($this->storage())->files($files); 
      } 

      public function validator(): ValidatorInterface 
      { 
       return new Validator(); 
      } 

      public function cleaner(): CleanerInterface 
      { 
       return new Cleaner(); 
      } 

      public function storage(): StorageInterface 
      { 
       return new Storage(); 
      } 

      public function dom(): DomInterface 
      { 
       return new Dom(); 
      } 
     } 

は、上記の工場で記事を作成するために、より便利である:

 $myTitle = 'my title'; 
     $myDes = 'mty description'; 
     $article = new ArticleFactory(); 
     $article->setTitle($myTitle); 
     $article->setDescription($myDes); 
     $files = $article->getFiles($description); 
     $article->storeFile($files); 

これはSOLIDの原則に違反していますか?

これについてもっと良いアプローチはありますか?

+1

**これらのすべてを作成するためにファクトリパターンを使用できますか**もちろん可能です。問題はそれがどれほど有用かということです。そしてそのためには、あなたがゼロの文脈を提供したので、クリスタルボールを尋ねる必要があります。 – Euphoric

+0

私はこれをあまりよく理解していません。 'ArticleFactory'がありますが、' Validator'、 'Cleaner'、' Storage'の型を返しています。これらの派生物または依存物は 'Article'ですか? –

+0

私は自分の答えを更新しました。あなたが何かもっと欲しければ教えてください。ありがとうございます –

答えて

-1

ArticleFactorySRPに違反しているようです。ArticleFactoryは複数のもの(建物の保管、保管、検証、清掃)に関係しているためです。

また、FactoryパターンとBuilderパターンの間に混乱があるようです。クラスArticleFactoryも記事をビルドする場合は、ビルダーが(構成)ビルダーを持っていて、そのビルダープロセスを委託していれば、より洗練されたものになります。ビルダーが本当に必要ですか?新しい記事を作成するプロセスが、複雑すぎる/高価であるため、ビルダーパターンが価値を増すでしょうか?

関数名(function ValidatorCleanerStorage)に名詞を使用すると、コードがわかりにくくなります。あなたの意図は何でしたか?

クラスの関数と名詞に動詞を使用します。

関連する問題