我们说我有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
的最佳做法是什么?
我开始创建两个类:
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
对象,因为我还不知道它是“正常”项目还是瓶子。
我是否应该实例化一个Bottle对象并研究我的应用程序中的另一个逻辑?或者有没有办法“重新创建”项目对象并将其转换为瓶子?
答案 0 :(得分: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)
当您有许多具有相同基类(或父类)的对象时,工厂模式很有用,您需要确定它们在运行时的类。