Frage

Bitte helfen Sie mir Fabrik-Entwurfsmuster für die Aufgabe zu implementieren.

ich arbeiten an geplanten Nachricht Senden Web-Anwendung. Der Benutzer kann seinen eigenen geplanten Sendeplan angeben, und Nachrichten werden geliefert, wenn es haben. Der Benutzer kann nur eines von 3 reccuring Typen wählen: monatlich, wöchentlich, täglich. Für diese 3 reccuring Typen Algorithmus ist ähnlich: 1) wählen Datum und Uhrzeit (für die erste Lieferung senden) 2) wählen Sie die Option in „wiederholen alle X Monate / Wochen / Tage“ je nach Typ reccuring angeben 3) Ende nach Typ (Datum oder Vorkommnisse limit)

Weekly Scheduler ist ein bisschen anders. Es hat eine weitere Funktion - Wochentage für die Wiederholung (ex: wiederholen jeden Mo, Fr)

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

Setter-Methoden:

$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

Ich möchte für Fabrikmuster verwenden Objektbau (Ist es das beste Spiel?), Und weiß nicht, wie kann ich alle diese Parameter übergeben (nicht nur $ Art, aber alle anderen) für Objektbau.

Sollte erstelle ich sie in einzelnem Datenobjekt wickeln und create-Methode „setOptions“ in der SchedulerFactory Klasse und übergebe dieses Datenobjekt zu „schaffen“ Bauverfahren durch Getter?

Vielleicht in der Fabrik Klasse solchen Setter-Methode zu schaffen ist Verletzung der Fabrik-Entwurfsmuster Prinzipien? Ich habe keine Beispiele wie diese sehen vor, so bin ich ein wenig verwirrt jetzt.

Wenn ich in absolut falsche Richtung gehe, lass es mich wissen. Was Lösung würden Sie für diese Aufgabe empfehlen?

Vielen Dank im Voraus

War es hilfreich?

Lösung

Sie könnten ein Wrapper-Objekt für die Planungsoptionen erstellen und die in der SchedulerFactory.create () -Methode zusammen mit dem Typ übergeben. In Ihrem Werk Methode würden Sie dann Scheduler-Objekte erstellen und Eigenschaften auf den Typen auf Basis festgelegt, so dass alles in der Scheduler-Fabrik eingekapselt ist. Ich nehme an, Sie auch etwas chaotisch tun könnten, und die PHP-Variable Methode Argumente anstelle ein Objekt verwenden, aber das wäre hässlich.

Ich würde vermeiden, dass ein setOptions Verfahren zu schaffen, da dies würde eine Instanz von SchedulerFactory verlangen, wenn als Objekt der Optionen Bestehen der Fabrik erlaubt (und create-Methode) statisch bleiben.

Um zu vartec des Beitrag hinzufügen, da es von Ihrem Design und die Verwendung des Musters Fabrik erscheint die Scheduler Unterklasse Eigenschaften nur gelesen werden, nachdem die Objekte erstellt werden, können Sie jeden Scheduler unveränderlich machen wollen durch die Eigenschaften erlauben nur gesetzt werden, zur Zeit wird das Objekt (im Konstruktor) erstellt.

Andere Tipps

Ich glaube, Sie die Fabrik Muster falsch verstanden. Fabrik sollte nur Objektinstanzen erstellen. Wie für weitere Parameter übergeben können Sie tun:

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

wobei $paramsArr ist Array von Konstruktoren Parameter

also:

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

entspricht:

$yourSched = new WeeklyScheduler('Monday');
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top