Передача объекта данных в Factory в PHP - PullRequest
0 голосов
/ 10 марта 2009

Пожалуйста, помогите мне реализовать шаблон фабричного дизайна для этой задачи.

Я работаю над запланированной отправкой сообщений веб-приложением. Пользователь может указать свой собственный план отправки по расписанию, и сообщения будут доставлены, когда это необходимо. Пользователь может выбрать только один из 3 типов рекуперации: ежемесячно, еженедельно, ежедневно. Для этого алгоритм трех типов восстановления похож: 1) выберите дату и время отправки (для первой доставки) 2) выберите вариант «повторять каждые X месяцев / недель / дней» в зависимости от типа восстановления 3) указать конец по типу (дата или ограничение по количеству вхождений)

Недельный планировщик немного отличается. Он имеет еще одну особенность - дни недели для повторения (например: повторять каждый понедельник, пятницу)

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

Методы установки:

$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

Я хочу использовать шаблон Factory для построения объектов (это наилучшее совпадение?) И не знаю, как я могу передать все эти параметры (не только $ type, но все остальные) для построения объектов.

Должен ли я создать обтекание их в одном объекте данных, создать метод "setOptions" в классе SchedulerFactory и передать этот объект данных для "создания" метода конструирования через геттер?

Может быть, создание такого метода установки в классе Factory является нарушением принципов шаблона проектирования Factory? Я не видел подобных примеров раньше, поэтому сейчас я немного запутался.

Если я иду в совершенно неверном направлении, пожалуйста, дайте мне знать. Какое решение вы бы порекомендовали для этой задачи?

Спасибо, заранее

Ответы [ 2 ]

2 голосов
/ 10 марта 2009

Я думаю, вы неправильно поняли заводскую модель. Фабрика должна создавать только экземпляры объектов. Что касается передачи большего количества параметров, вы можете сделать:

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 - массив параметров конструкторов

следующим образом:

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

эквивалентно:

$yourSched = new WeeklyScheduler('Monday');
1 голос
/ 10 марта 2009

Вы можете создать объект-оболочку для параметров планирования и передать его вместе с типом в метод SchedulerFactory.create (). В вашем фабричном методе вы затем создадите объекты планировщика и установите свойства на основе типов, чтобы все было инкапсулировано в фабрике планировщика. Я полагаю, вы могли бы также сделать что-то грязное и использовать аргументы метода переменных PHP вместо объекта, но это было бы ужасно.

Я бы не стал создавать метод setOptions, поскольку для этого потребовался бы экземпляр SchedulerFactory, в котором передача параметров в виде объекта позволяет фабрике (и методу создания) оставаться статической.

Чтобы добавить к сообщению vartec, поскольку из вашего дизайна и использования шаблона Factory свойства подкласса Scheduler считываются только после создания объектов, вы можете захотеть сделать каждый планировщик неизменным, разрешив устанавливать только свойства в момент создания объекта (в конструкторе).

...