abstract class ApptEncoder{ abstract function encode(); } class BloggsApptEncoder extends ApptEncoder{ function encode(){ return 'this is bloggs object'; } } class MegaApptEncoder extends ApptEncoder{ function encode(){ return 'this is mega object'; } } class CommsManager{ const BLOGGS = 1; const MEAG = 2; private $mode = 1; function __construct($mode){ $this->mode; } function getAppEncoder(){ switch ($this->mode){ case (self::BLOGGS): return new BloggsApptEncoder(); case (self::MEAG): return new MegaApptEncoder(); } } } $comms = new CommsManager(CommsManager::MEAG); $apptEncoder = $comms->getAppEncoder(); print_r($apptEncoder->encode()); //输出:this is bloggs object
以上属于典型的简单工厂模式,可以适用于简单的运行模式,存在一定的缺陷,当我们需要在CommsManager中新增一个模式方法时,我们不得不再次进行模式的判断,CommsManager如下(我们新增了getHeaderText):
class CommsManager{ const BLOGGS = 1; const MEAG = 2; private $mode = 1; function __construct($mode){ $this->mode; } function getAppEncoder(){ switch ($this->mode){ case (self::BLOGGS): return new BloggsApptEncoder(); case (self::MEAG): return new MegaApptEncoder(); } } function getHeaderText(){ switch ($this->mode){ case (self::BLOGGS): return 'this is bloggs headerText'; case (self::MEAG): return 'this is meag headerText'; } } }从上面我们可以看出,我们使用了重复的代码判断条件,我们可以对此进行简化和进一步的改进,也就是我们的工厂方法模式