2012-04-30 6 views
0

私は3つの項目があるとしましょう:キーボード、Tシャツ、コーラのボトル。いつ子どものクラスをインスタンス化する必要がありますか?

$keyboard = new Item("Keyboard"); 
echo $keyboard->getPrice(); // return 50; 

$tshirt = new Item("Tshirt"); 
echo $tshirt->getPrice(); // return 20; 

$cola = new Item("Cola"); 
echo $cola->getPrice(); // return 0 or 2 whether the bottle is empty or not. 

コーラの瓶のPriceを取得するためのベストプラクティスは何ですか?

私は2クラスに作成することによって開始:

Class Item { 
    $this->price; 

    function __construct($name) { 
    // ... 
    } 

    public function getPrice() { 
     return $this->price; 
    } 
} 

Class Bottle extends Item { 
    $this->empty; 

    function __construct($name) { 
    // get from database the value of $this->empty 
    } 
    public function getPrice() { 
     if($this->empty) 
      return 0; 
     else 
      return $this->price; 
    } 
} 

をしかし、今、私は思ったんだけど。私が使用している場合:$cola = new Item("Cola");、私はItemオブジェクトではなく、Bottleオブジェクトではないことをインスタンス化しています。なぜなら、 "普通"のアイテムまたはボトルであるかどうかはまだ分かりません。

ボトルオブジェクトをインスタンス化し、アプリケーションの別のロジックを調べるべきですか?または、アイテムオブジェクトを「再作成」してボトルとして変換する方法はありますか?

答えて

2

これは、Factory Patternを使用する場合の完全な例です。

コードでは、このようなことを行うことができます。

class ItemFactory { 
    // we don't need a constructor since we'll probably never have a need 
    // to instantiate it. 
    static function getItem($item){ 
     if ($item == "Coke") { 
      return new Bottle($item); 
     } else if (/* some more of your items here */){ 
      /*code to return object extending item*/ 
     } else { 
      // We don't have a definition for it, so just return a generic item. 
      return new Item($item); 
     } 
    } 
} 

あなたは同じベース(または親)クラスを持つオブジェクトの多くを持っている場合は、出荷時のパターンは有用であり、あなたは彼らがであるか、クラスを決定する必要が$item = ItemFactory::getItem($yourvar)

のようにそれを使用することができますランタイム。

+0

工場向け+1ですが、リンクがダウンしています:http://www.dofactory.com/Patterns/PatternAbstract.aspx –

関連する問題