2016-11-07 1 views
1

Disons que nous avons un système qui construit des articles. L'article a quelques validateur composants, plus propre, le stockage .... Dans le client pour construire un article que je dois instancier chaque composant:Utilisation du modèle d'usine pour divers composants/modules

$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.... 

Sans eux, il est impossible de construire un article.

Ma question est: Puis-je utiliser le modèle d'usine pour créer tous ces comme ceci:

  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(); 
      } 
     } 

Dans le client est plus pratique de créer un article avec l'usine ci-dessus:

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

Est-ce que cela viole l'un des principes SOLID?

Y a-t-il une meilleure approche à ce sujet?

+1

** Puis-je utiliser le motif d'usine pour créer tous ces ** Bien sûr que vous pouvez. La question est de savoir si cela va être utile. Et pour cela, nous aurions besoin de demander à notre boule de cristal, parce que vous avez fourni le contexte zéro. – Euphoric

+0

Je ne comprends pas trop bien. Vous avez un 'ArticleFactory' mais vous renvoyez les types' Validator', 'Cleaner' et' Storage'. Sont ces dérivés ou dépendances de 'Article'? –

+0

J'ai mis à jour ma réponse. Faites-moi savoir si vous voulez quelque chose de plus. Merci –

Répondre

-1

La classe ArticleFactory semble être en infraction SRP car ArticleFactory est concerné par plus d'une chose (construction, stockage, validation et nettoyage des articles).

Il semble également y avoir une confusion ici entre le modèle Factory et le modèle Builder. Si la classe ArticleFactory construit aussi des articles, alors elle serait plus propre si elle avait un constructeur et lui déléguait le processus de construction. Avez-vous vraiment besoin d'un constructeur? Le processus de création de nouveaux articles est-il si compliqué/coûteux que le modèle de constructeur ajoutera de la valeur?

L'utilisation de noms dans les noms de fonctions (function Validator, Cleaner, Storage) rend le code difficile à comprendre. Quelle était votre intention là-bas?

Utilisez les verbes pour les fonctions et les noms pour les classes.