Pregunta

Por favor, ayúdame a implementar el patrón de diseño de Fábrica para la tarea.

Estoy trabajando en la aplicación web de envío de mensajes programados. El usuario puede especificar su propio plan de envío programado, y los mensajes se entregarán cuando sea necesario. El usuario puede elegir solo uno de los 3 tipos recurrentes: mensual, semanal, diario. Para este algoritmo de 3 tipos recurrentes es similar: 1) elija la fecha y hora de envío (para la primera entrega) 2) elija la opción en "repetir cada X meses / semanas / días" dependiendo del tipo recurrente 3) especifique el final por tipo (fecha o límite de ocurrencias)

El programador semanal es un poco diferente. Tiene una característica más: días de la semana para repetir (por ejemplo, repetir cada lunes, viernes)

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étodos 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

Quiero usar el patrón Factory para la construcción de objetos (¿Es la mejor coincidencia?), y no sé cómo puedo pasar todos estos parámetros (no solo $ type, sino todos los demás) para la construcción de objetos.

¿Debería crearlos envolverlos en un solo objeto de datos y crear el método " setOptions " en la clase SchedulerFactory y pase este objeto de datos a "crear" método de construcción a través de getter?

¿Quizás la creación de dicho método de establecimiento en la clase Factory es una violación de los principios del patrón de diseño Factory? No vi ejemplos como este antes, así que ahora estoy un poco confundido.

Si voy en una dirección absolutamente equivocada, hágamelo saber. ¿Qué solución recomendarías para esta tarea?

Gracias de antemano

¿Fue útil?

Solución

Puede crear un objeto contenedor para las opciones de programación y pasarlo junto con el tipo al método SchedulerFactory.create (). En su método de fábrica, crearía objetos de planificador y establecería propiedades basadas en los tipos para que todo se encapsule en la Fábrica de planificador. Supongo que también podrías hacer algo desordenado y usar los argumentos del método variable de PHP en lugar de un objeto, pero eso sería feo.

Evitaría crear un método setOptions ya que esto requeriría una instancia de SchedulerFactory donde pasar las opciones como un objeto permite que la fábrica (y el método de creación) permanezcan estáticos.

Para agregar a la publicación de vartec, dado que se desprende de su diseño y uso del patrón Factory, las propiedades de la subclase del Programador solo se leen después de que se crean los objetos, puede hacer que cada Programador sea inmutable permitiendo que las propiedades solo se establezcan en el momento en que se crea el objeto (en el constructor).

Otros consejos

Creo que entendiste mal el patrón de fábrica. Factory solo debe crear instancias de objetos. En cuanto a pasar más parámetros que puede hacer:

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

donde $ paramsArr es una matriz de parámetros de constructores

así:

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

es equivalente a:

$yourSched = new WeeklyScheduler('Monday');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top