2009-03-10 2 views
0

S'il vous plaît aidez-moi à implémenter le modèle de conception d'usine pour la tâche.Passer l'objet de données à l'usine dans PHP

Je travaille sur une application Web d'envoi de message programmé. L'utilisateur peut spécifier son propre plan d'envoi planifié et les messages seront livrés lorsqu'il le faut. L'utilisateur peut choisir l'un des 3 types de reccuring: mensuel, hebdomadaire, quotidien. Pour ces 3 types de reccuring l'algorithme est similaire: 1) choisir la date et l'heure d'envoi (pour la première livraison) 2) choisir l'option "répéter tous les X mois/semaines/jours" selon le type de reccuring 3) spécifier fin par type (date ou limite d'occurrence)

Le planificateur hebdomadaire est un peu différent. Il dispose d'une fonctionnalité de plus - jours de la semaine pour répéter (ex: répéter tous les LUN., ven)

class SchedulerFactory { 
    public function create($type) { 
     switch ($type) { 
      case "monthly" : 
       $Scheduler = new MonthlyScheduler(); 
     break; 
      case "weekly" : 
       $Scheduler = new WeeklyScheduler(); 
     break; 
      case "daily": 
       $Scheduler = new DailyScheduler(); 
     break; 
      default: 
       return null; 
     } 
    } 
} 

méthodes setter:

$SendScheduler->setSendDateAndTime("{$day}.{$month}.{$year}", time()); 

switch($end_by_type) { 
case 'by_date': 
    $SendScheduler-  >setEndByDate("{$end_by_date_day}.{$end_by_date_month}.{$end_by_date_year}"); 
    break; 
case 'by_occurences_limit': 
    $SendScheduler->setOccurencesLimit($occurences_quantity); 
    break;     
} 

$SendScheduler->addTaskOccuringEvery($RepeatEveryMonth);// repeat every X months/weeks/days depending on type 

// only for weekly type 
$SendScheduler->setWeekDayForRepeating($week_day); // repeat every Mon, Fri 

Je veux utiliser modèle d'usine pour la construction de l'objet (est-ce le meilleure correspondance?), et ne sais pas comment puis-je passer tous ces paramètres (pas seulement $ type, mais tous les autres) pour la construction de l'objet. Dois-je créer un retour à la ligne dans un objet de données unique et créer la méthode "setOptions" dans la classe SchedulerFactory et passer cet objet de données à "créer" la méthode de construction via getter?

La création d'une telle méthode d'ensimage dans la classe Factory peut-elle constituer une violation des principes du modèle de conception d'usine? Je n'ai pas vu d'exemple comme celui-ci avant, donc je suis un peu confus maintenant.

Si je vais dans la mauvaise direction, s'il vous plaît faites le moi savoir. Quelle solution recommanderiez-vous pour cette tâche?

Merci à l'avance

Répondre

1

Vous pouvez créer un objet wrapper pour les options de planification et de passer ainsi que le type à la méthode SchedulerFactory.create(). Dans votre méthode d'usine, vous devez ensuite créer des objets de planificateur et définir des propriétés en fonction des types de façon à ce que tout soit encapsulé dans l'atelier de planification. Je suppose que vous pourriez aussi faire quelque chose de désordonné et utiliser les arguments de la méthode variable de PHP au lieu d'un objet mais cela deviendrait moche. J'éviterais de créer une méthode setOptions car cela nécessiterait une instance de SchedulerFactory où passer les options en tant qu'objet permet à la fabrique (et à la méthode create) de rester statique. Pour ajouter à la publication de vartec, puisqu'il apparaît à partir de votre conception et de l'utilisation du modèle Factory, les propriétés de la sous-classe Scheduler ne sont lues qu'après la création des objets, vous pouvez rendre chaque planificateur immuable en autorisant uniquement les propriétés défini au moment de la création de l'objet (dans le constructeur).

2

Je pense que vous avez mal compris le modèle d'usine. Factory ne doit créer que des instances d'objet.En ce qui concerne passant plus de paramètres que vous pouvez faire:

class Scheduler { 
    public function factory($type, $paramsArr = array()) { 
     switch ($type) { 
      case 'monthly' : $className = 'MonthlyScheduler'; break; 
      case 'weekly' : $className = 'WeeklyScheduler'; break; 
      case 'daily' : $className = 'DailyScheduler'; break; 
      default: return null; 
     } 
     $sched = new ReflectionClass($className); 
     return $sched->newInstanceArgs($paramsArr); ; 
    } 
} 

$paramsArr est un tableau de paramètres constructeurs

ainsi:

$yourSched = Scheduler::factory('weekly',array('Monday')); 

est équivalent à:

$yourSched = new WeeklyScheduler('Monday'); 
Questions connexes