0

タスクの工場設計パターンを実装するのを手伝ってください。

スケジュールされたメッセージ送信 Web アプリケーションに取り組んでいます。ユーザーは自分のスケジュールされた送信計画を指定でき、必要なときにメッセージが配信されます。ユーザーは、月次、週次、日次の 3 つの繰り返しタイプから 1 つだけを選択できます。この 3 つの繰り返しタイプのアルゴリズムは似ています: 1) 送信日時を選択します (最初の配信の場合) 2) 繰り返しタイプに応じて「X か月/週/日ごとに繰り返す」オプションを選択します 3) タイプ (日付または日付) で終了を指定します発生制限)

毎週のスケジューラは少し異なります。もう 1 つの機能があります - 繰り返す曜日 (例: 月、金ごとに繰り返す)

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 だけでなく、その他すべて) をオブジェクトの構築に渡す方法がわかりません。

それらを単一のデータ オブジェクトにラップして作成し、SchedulerFactory クラスでメソッド「setOptions」を作成し、このデータ オブジェクトを getter を介して「作成」構築メソッドに渡す必要がありますか?

Factory クラスでそのようなセッター メソッドを作成することは、Factory デザイン パターンの原則に違反しているのでしょうか。前にこのような例を見たことがなかったので、今は少し混乱しています。

まったく間違った方向に進んでいる場合は、お知らせください。このタスクにはどのソリューションをお勧めしますか?

前もって感謝します

4

2 に答える 2

4

工場のパターンを誤解していると思います。Factory は、オブジェクト インスタンスのみを作成する必要があります。より多くのパラメーターを渡すことについては、次のことができます。

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');
于 2009-03-10T15:49:55.897 に答える
1

スケジューリング オプションのラッパー オブジェクトを作成し、それを型とともに SchedulerFactory.create() メソッドに渡すことができます。次に、ファクトリ メソッドでスケジューラ オブジェクトを作成し、タイプに基づいてプロパティを設定して、すべてがスケジューラ ファクトリにカプセル化されるようにします。何か面倒なことをして、オブジェクトの代わりに PHP の可変メソッド引数を使用することもできると思いますが、それは見苦しくなります。

オプションをオブジェクトとして渡すことでファクトリ (および create メソッド) を静的に保つことができる SchedulerFactory のインスタンスが必要になるため、setOptions メソッドの作成は避けます。

vartec の投稿に追加するには、Factory パターンの設計と使用から見えるため、Scheduler サブクラスのプロパティはオブジェクトが作成された後にのみ読み取られるため、プロパティをその時点でのみ設定できるようにすることで、各 Scheduler を不変にすることができます。オブジェクトが(コンストラクターで)作成されます。

于 2009-03-10T15:49:20.653 に答える