<?php# 簡單工廠abstractclass mycoach{public function __construct(){}}class cultivatecpc extends mycoach{public function __construct(){echo "把陳培昌培養(yǎng)為搏擊教練"."\n";}}class cultivatecj extends mycoach{public function __construct(){echo "把程勁培養(yǎng)為搏擊教練"."\n";}}class martialclub {public function cultivate($name){switch($name){case'cj':returnnew cultivatecj();case'cpc':returnnew cultivatecpc();default:echo '培養(yǎng)一個小教練'."\n";break;}returnnull;}}class clubmaster{public function cultivate(){$myclub = new martialclub();$myclub->cultivate('cj');$myclub = new martialclub();$myclub->cultivate('cpc');}}$mymaster = new clubmaster();$mymaster->cultivate();
輸出結果:
把程勁培養(yǎng)為搏擊教練
把陳培昌培養(yǎng)為搏擊教練
?(復雜)工廠
<?php
abstractclass mycoach
{public function __construct(){}
}class cpc extends mycoach
{public function __construct(){echo "培養(yǎng)出了搏擊教練昌仔"."\n";}
}class cj extends mycoach
{public function __construct(){echo "培養(yǎng)出了搏擊教練勁兒弟弟"."\n"; }
}interface cultivate{function cultivate();
}class cultivatecpc implements cultivate
{public function cultivate(){returnnew cpc();}
}class cultivatecj implements cultivate
{public function cultivate(){returnnew cj();}
}class coach{public function __construct(){$coach = new cultivatecpc();$coach->cultivate();$coach = new cultivatecj();$coach->cultivate();}
}$littlecoach = new coach();
輸出結果:
培養(yǎng)出了搏擊教練昌仔
培養(yǎng)出了搏擊教練勁兒弟弟
?觀察者模式
<?phpclass watcher{private $name;public function __construct($myname){$this->name=$myname;}public function update($food){switch($food){case'奶油蛋糕':echo $food."上桌了,".$this->name.'取出了一份紙盤子和塑料叉子,切了一塊'."\n";break;case'烤鴨':echo $food."上桌了,".$this->name.'取了張薄餅,夾了些許蔥絲,刷了些甜面醬'."\n";break;default:echo $food."上桌了,".$this->name."趕緊加了兩筷子"."\n";break;}returnnull;}}class watchee{private $watchlist = [];public function addwatcher($watcher){$this->watchlist[]=$watcher;}public function removewatcher($watcher){$target = array_search($watcher,$this->watchlist);$target = (int)$target;unset($this->watchlist[$target]);//echo $target."\n"; }public function loaddish($dishname){$this->notify($dishname);}public function notify($dishname){ #這里推薦用foreach循環(huán),for循環(huán)帶來的陷阱是,如果以數(shù)字為索引,執(zhí)行removewatcher方法后,有些索引就沒了,訪問不到就會報錯 foreach($this->watchlist as $k=>$v){$this->watchlist[$k]->update($dishname);}}}$cpc = new watcher('陳培昌');$cj = new watcher('程勁');$observee = new watchee();$observee->addwatcher($cpc);$observee->addwatcher($cj);$observee->loaddish('蔥香四川涼面');$observee->removewatcher($cj);$observee->loaddish('奶油蛋糕');$xxd = new watcher('徐曉冬');$observee->addwatcher($xxd);$observee->loaddish('避風塘茄子');