Pergunta

Por favor me ajude a implementar padrão de projeto Fábrica para a tarefa.

Eu trabalho em mensagem programada envio de aplicativos web. O usuário pode especificar o seu próprio plano de envio programado, e as mensagens serão entregues quando se precisa. O usuário pode escolher apenas um dos 3 tipos reccuring: mensal, semanal, diária. Para este 3 tipos reccuring algoritmo é semelhante: 1) escolha a data de envio e tempo (para primeira entrega) 2) escolha a opção em "repetir a cada x meses / semanas / dias", dependendo do tipo reccuring 3) especificar final por tipo (data ou por ocorrências limite)

programador semanal é um pouco diferente. Ele tem mais uma característica - dias da semana para repetir (ex: repetir a cada segunda-feira, sexta-feira)

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

Eu quero usar o padrão de fábrica para a construção de objeto (É o melhor jogo?), E não sei como eu posso passar todos estes parâmetros (e não apenas $ tipo, mas todos os outros) para a construção do objeto.

Devo criar envolvê-los em objeto de dados única, e criar métodos "setOptions" na classe SchedulerFactory e passar esse objeto de dados para "criar" método de construção através getter?

Talvez a criação de tal método setter na classe de fábrica é violação da fábrica princípios padrão de design? Eu não vi um exemplos como este antes, por isso estou um pouco confuso agora.

Se eu vou em direção absolutamente errado, por favor me avise. Que solução você recomendaria para esta tarefa?

Obrigado, antecipadamente

Foi útil?

Solução

Você pode criar um objeto wrapper para as opções de agendamento e passar que, juntamente com o tipo para o método SchedulerFactory.create (). No seu método de fábrica que seria, então, criar objetos de planejador e definir propriedades com base nos tipos de modo que tudo é encapsulado na Fábrica Scheduler. Eu suponho que você também poderia fazer algo confuso e usar argumentos do método de variáveis ??do PHP, em vez de um objeto, mas que iria ficar feio.

Gostaria de evitar a criação de um método setOptions pois isso exigiria uma instância de SchedulerFactory onde passar as opções como um objeto permite que a fábrica (e criar método) para permanecer estático.

Para adicionar ao post de vartec, uma vez que parece a partir de sua concepção e utilização do padrão de fábrica propriedades do Scheduler subclasse são lidos somente depois que os objetos são criados, você pode querer fazer cada imutável Scheduler, permitindo que as propriedades para ser definido apenas no momento em que o objeto é criado (no construtor).

Outras dicas

Eu acho que você entendeu mal o padrão de fábrica. Fábrica só deve criar instâncias de objetos. Como para passar mais parâmetros que você pode fazer:

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

onde $paramsArr é matriz de parâmetros construtores

assim:

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

é equivalente a:

$yourSched = new WeeklyScheduler('Monday');
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top