2016-07-13 8 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

ありがとう@ディーン・フェンスター、私は思ったが確かではなかった。 –

関連する問題