适用性
工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类的步骤。
UML
代码示例
为了管理控制CD,应用程序需要将必要的信息编辑入CD 对象。然后传递出去。完成CD创建工作。CD 对象需要包含标题,乐队名称,曲目列表。
class cd
{
public $title = '';
public $band = '';
public $track = array();
public function __construct()
{
}
public function setTitle($title)
{
$this->title = $title;
}
public function setBand($band)
{
$this->band = $band;
}
public function addTrack($track)
{
$this->track[] = $track;
}
}
为了创建完整的CD对象。处理过程相同: 创建一个CD类的实例,然后添加标题,乐队名称,曲目列表。
$title = 'Waste of a Rib';
$band = 'Never Again';
$tracksFromExternalSoutce = array('What It Means','Brrr','Goodbye');
$cd = new CD();
$cd->setTitle($title);
$cd->setBand($band);
foreach ($tracksFromExternalSoutce as $track ){
$cd->addTrack($track);
}
输出:
object(cd)#1 (3) {
["title"]=>
string(14) "Waste of a Rib"
["band"]=>
string(11) "Never Again"
["track"]=>
array(3) {
[0]=>
string(13) "What It Means"
[1]=>
string(4) "Brrr"
[2]=>
string(7) "Goodbye"
}
}
如今,某些艺术家在他们的CD上发布了在计算机中能够使用的其他内容。这些CD称为增强型CD。写至光盘的第一个音轨是数据音轨。管理控制软件通过其他标签DATA TRACK识别数据音轨,并且创建相应的CD对象。
class enhancedCD
{
public $title = '';
public $band = '';
public $track = array();
public function __construct()
{
$this->track[] = 'DATA TRACK';
}
public function setTitle($title)
{
$this->title = $title;
}
public function setBand($band)
{
$this->band = $band;
}
public function addTrack($track)
{
$this->track[] = $track;
}
}
查看上述共性和认识到只可能存在两种CD类型之后,似乎我们只需要创造条件语句。如果CD类型是增强型CD,那么就创建enhancedCD类的实例。否则,就应创建通用CD类。然而更好的解决方案:使用工厂设计模式。 CDFactory类使用了PHP根据比变量动态实例化一个类的能力。create()方法接受被请求类的类型并返回类的一个实例:
class CDFactry
{
public static function create($type)
{
$class = strtolower($type).'CD';
return new $class;
}
}
现在,类的创建和执行变化反应了Factory 类的用法:
$type = 'enhanced';
$cd = CDFactry::create($type);
$cd->setBand($band);
$cd->setTitle($title);
foreach ($tracksFromExternalSoutce as $track ){
$cd->addTrack($track);
}
输出:
object(enhancedCD)#2 (3) {
["title"]=>
string(14) "Waste of a Rib"
["band"]=>
string(11) "Never Again"
["track"]=>
array(4) {
[0]=>
string(10) "DATA TRACK"
[1]=>
string(13) "What It Means"
[2]=>
string(4) "Brrr"
[3]=>
string(7) "Goodbye"
}
}