2016-11-07 50 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'類型。這些衍生物或「條款」的依賴關係? –

+0

我已經更新了我的回答。讓我知道你是否想要更多東西。謝謝 –

回答

-1

該類ArticleFactory似乎違反SRP,因爲ArticleFactory涉及不止一件事(建設,存儲,驗證和清潔文章)。

Factory模式和Builder模式之間似乎也存在混淆。如果類ArticleFactory也構建物品,那麼它會更清潔,如果它具有(構圖)構建器並將構建過程委託給它。你真的需要建築師嗎?創建新文章的過程如此複雜/昂貴,以至於構建器模式會增加價值?

功能名稱中使用名詞(function Validator,Cleaner,Storage)使代碼難以理解。那你有什麼打算?

使用動詞的功能和名詞的類。