2016-11-07 51 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)使代码难以理解。那你有什么打算?

使用动词的功能和名词的类。