Question

Aidez-moi à implémenter le modèle de conception Factory pour la tâche.

Je travaille sur l'application Web d'envoi de messages planifiés. L'utilisateur peut spécifier son propre plan d'envoi planifié et les messages seront remis quand il le faudra. L'utilisateur peut choisir un seul des 3 types de rechuration: mensuel, hebdomadaire, quotidien. Pour cet algorithme de 3 types de rechuring est similaire: 1) choisissez la date et l'heure d'envoi (pour la première livraison) 2) choisissez une option dans "Répéter tous les X mois / semaines / jours". selon le type de rechuration 3) spécifiez la fin par type (date ou limite d’occurrences)

Le programmateur hebdomadaire est un peu différent. Il a encore une fonctionnalité - les jours de la semaine pour la répétition (ex: répétez chaque lundi, vendredi)

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 souhaite utiliser le modèle d'usine pour la construction d'objet (s'agit-il de la meilleure correspondance?) et je ne sais pas comment puis-je passer tous ces paramètres (pas seulement $ type, mais tous les autres) pour la construction d'objet.

Devrais-je créer les envelopper dans un seul objet de données et créer la méthode " setOptions " dans la classe SchedulerFactory et transmettez cet objet de données à " create " méthode de construction par getter?

Peut-être que la création d'une telle méthode de définition dans la classe Factory est une violation des principes de modèle de conception Factory? Je n'ai jamais vu d'exemples comme celui-ci auparavant, alors je suis un peu confus maintenant.

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

Merci d'avance

Était-ce utile?

La solution

Vous pouvez créer un objet wrapper pour les options de planification et le transmettre avec le type à la méthode SchedulerFactory.create (). Dans votre méthode de fabrique, vous créez ensuite des objets de planificateur et définissez les propriétés en fonction des types, de sorte que tout soit encapsulé dans la fabrique de planificateur. Je suppose que vous pourriez aussi faire quelque chose de compliqué et utiliser les arguments de la méthode variable de PHP à la place d'un objet, mais cela deviendrait moche.

J'éviterais de créer une méthode setOptions car cela nécessiterait une instance de SchedulerFactory dans laquelle le passage des options en tant qu'objet permet à la fabrique (et à la méthode create) de rester statique.

Pour ajouter à la publication de vartec, comme il ressort de votre conception et de l'utilisation du modèle d'usine que les propriétés de la sous-classe du planificateur sont lues uniquement après la création des objets, vous pouvez rendre chaque planificateur immuable en permettant uniquement de définir les propriétés. au moment de la création de l'objet (dans le constructeur).

Autres conseils

Je pense que vous avez mal compris le modèle d'usine. Factory ne doit créer que des instances d'objet. Pour ce qui est de transmettre plus de paramètres, vous pouvez le 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 de constructeur

ainsi:

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

est équivalent à:

$yourSched = new WeeklyScheduler('Monday');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top