2016-07-13 3 views
0

특정 하위 클래스를 조건부로 인스턴스화하는 올바른 방법이 있습니까?조건부로 올바른 하위 클래스를 인스턴스화 하시겠습니까?

예를 들어 User 클래스에는 get_membership() 메서드가 포함되어 있으며 전달되는 멤버 자격 유형을 기반으로 하위 클래스를 반환합니다. 현재 switch 문을 사용하여 올바른 하위 클래스를 반환하고 있지만 이것이 최선의 방법이라고 확신하지는 않습니다. 내가 작업 '무엇을

짧은 예 : 그것은 보통은 다른 클래스/메소드에이 논리를 분리하는 것이 좋습니다하지만 조건부 오른쪽 서브 클래스의 인스턴스를 OK입니다

class User 
{ 
    public $user_id; 
    public function __construct($user_id) 
    { 
    $this->user_id = $user_id; 
    } 
    public function get_membership($membership_type = 'annual') 
    { 
    switch($membership_type) 
    { 
    case 'annual': 
    return new AnnualMembership($this->user_id); 
    break; 

    case 'monthly': 
    return new MonthlyMembership($this->user_id); 
    break; 
    } 
    } 
} 

abstract class UserMembership 
{ 
    protected $user_id; 
    protected $length_in_days; 

    public function __construct($user_id) 
    { 
    $this->user_id = $user_id; 
    $this->setup(); 
    } 

    abstract protected function get_length_in_days(); 
    abstract protected function setup(); 

} 

class AnnualMembership extends UserMembership 
{ 
    public function setup() { 
    $this->length_in_days = 365; 
    } 

    public function get_length_in_days() 
    { 
    return $this->length_in_days; 
    } 
} 

class MonthlyMembership extends UserMembership 
{ 
    public function setup() { 
    $this->length_in_days = 30; 
    } 

    public function get_length_in_days() 
    { 
    return $this->length_in_days; 
    } 
} 

답변

0

하는 factory을했다. 실제로 이것은 매우 일반적인 것입니다 design pattern.

+0

감사합니다. @ dean-fenster, 나는 생각했지만 확실하지 않았습니다. –

관련 문제