2009-03-10 7 views
0

このタスクのFactoryデザインパターンを実装するのを手伝ってください。PHPでデータオブジェクトをFactoryに渡す

私は、スケジュールされたメッセージ送信Webアプリケーションに取り組んでいます。 ユーザーは、自分のスケジュールされた送信計画を指定できます。メッセージは、送信が必要なときに配信されます。 ユーザーは、毎月、毎週、毎日の3種類のリクルートタイプのうちの1つだけを選択できます。 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を使用して作成メソッドに渡す必要がありますか?

ファクトリクラスでこのようなセッタメソッドを作成することは、ファクトリデザインパターンの原則に違反している可能性がありますか?私は前にこのような例は見ませんでしたので、少し混乱しています。

私が間違った方向に向いている場合は、教えてください。 このタスクではどのような解決策をお勧めしますか?

おかげで、事前

答えて

1

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

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

vartecの投稿に追加するには、ファクトリパターンのデザインと使用から表示されるため、スケジューラのサブクラスプロパティはオブジェクトの作成後にのみ読み込まれるため、各スケジューラを不変にすることができますオブジェクトがコンストラクタ内で作成された時点で設定されます。

2

私はあなたが工場のパターンを誤解していると思います。 工場でオブジェクトインスタンスを作成する必要があります。あなたが行うことができますより多くのパラメータを渡すためとして :$paramsArrは、コンストラクタの配列です

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

は、このように

パラメータ:

$yourSched = new WeeklyScheduler('Monday'); 

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

は同等です

関連する問題