문제

작업에 맞는 Factory 디자인 패턴을 구현하도록 도와주세요.

나는 예약된 메시지 전송 웹 애플리케이션을 작업하고 있습니다.사용자는 자신의 예약된 전송 계획을 지정할 수 있으며 필요할 때 메시지가 전달됩니다.사용자는 3가지 반복 유형 중 하나만 선택할 수 있습니다.월간, 주간, 매일.이 3가지 반복 유형의 알고리즘은 유사합니다.1) 날짜와 시간 보내기 (첫 번째 배송) 2) "x 개월/주/일마다 반복"에서 옵션을 선택하십시오.

주간 스케줄러는 약간 다릅니다.반복되는 요일이라는 기능이 하나 더 있습니다(예:매주 월,금 반복)

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

객체 생성을 위해 팩토리 패턴을 사용하고 싶은데(가장 일치합니까?) 객체 생성을 위해 이 모든 매개변수($type뿐만 아니라 다른 모든 매개변수)를 어떻게 전달할 수 있는지 모르겠습니다.

단일 데이터 객체로 래핑을 생성하고 SchedulerFactory 클래스에 "setOptions" 메소드를 생성하고 이 데이터 객체를 getter를 통해 생성 메소드 "생성"에 전달해야 합니까?

아마도 Factory 클래스에서 이러한 setter 메소드를 생성하는 것은 Factory 디자인 패턴 원칙을 위반하는 것일까요?이전에는 이런 예를 본 적이 없어서 지금은 약간 혼란스럽습니다.

내가 완전히 잘못된 방향으로 가고 있다면 알려주세요.이 작업에 어떤 솔루션을 추천하시겠습니까?

감사합니다. 미리

도움이 되었습니까?

해결책

일정 옵션에 대한 래퍼 개체를 만들고 이를 유형과 함께 SchedulerFactory.create() 메서드에 전달할 수 있습니다.그런 다음 팩토리 메서드에서는 스케줄러 개체를 만들고 유형에 따라 속성을 설정하여 모든 것이 스케줄러 팩토리에 캡슐화되도록 합니다.나는 당신이 뭔가 지저분한 일을 하고 객체 대신에 PHP의 가변 메소드 인수를 사용할 수도 있다고 가정하지만 그것은 추악해질 것입니다.

옵션을 개체로 전달하면 팩토리(및 생성 메서드)가 정적으로 유지될 수 있는 SchedulerFactory 인스턴스가 필요하므로 setOptions 메서드를 생성하지 않을 것입니다.

vartec의 게시물에 추가하려면 Factory 패턴의 설계 및 사용에서 나타나기 때문에 Scheduler 하위 클래스 속성은 객체가 생성된 후에만 읽혀지므로 해당 속성이 해당 시점에만 설정되도록 허용하여 각 Scheduler를 변경할 수 없게 만드는 것이 좋습니다. 객체가 생성됩니다(생성자에서).

다른 팁

나는 당신이 공장 패턴을 오해했다고 생각합니다. 공장은 객체 인스턴스 만 생성해야합니다. 더 많은 매개 변수를 전달할 수 있습니다.

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');
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top