2016-11-07 13 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) делает код трудным для понимания. Каково было ваше намерение?

Использование глаголов для функций и существительных для классов.

 Смежные вопросы

  • Нет связанных вопросов^_^