/*
* 为了管理控制CD,应用程序需要将必要的信息编辑入CD对象。将CD对象传递给外部供应商,这些人会完成实际的CD创建工作。
* CD对象需要包含标题、乐队名称以及曲目列表
* */
class CD
{
public $title = '';
public $band = '';
public $tracks = [];
public function __construct(){}
/**
* @param string $title
*/
public function setTitle($title)
{
$this->title = $title;
}
/**
* @param string $band
*/
public function setBand($band)
{
$this->band = $band;
}
public function addTrack($track)
{
$this->tracks[] = $track;
}
}
/*为了创建完整的CD对象,处理过程总是相同的:首先创建CD类的一个实例,然后添加标题、乐队名称和曲目列表*/
$title = 'Waste of a Rib';
$band = 'Never Again';
$tracksFromExternalSource = ['What It Means', 'Brrr', 'Goodbye'];
$cd = new CD();
$cd->setTitle($title);
$cd->setBand($band);
foreach ($tracksFromExternalSource as $track) {
$cd->addTrack($track);
}
/*
* 如今,某些艺术家在他们的CD上发布了在计算机中能够使用的其它内容。这些CD称为增强型CD。写至光盘的第一个音轨是数据音轨。
* 管理控制软件通过其标签DATA TRACK识别数据音轨,并且创建相应的CD对象。
* */
class enhancedCD
{
public $title = '';
public $band = '';
public $tracks = [];
public function __construct()
{
$this->tracks[] = 'DATA TRACK';
}
/**
* @param string $title
*/
public function setTitle($title)
{
$this->title = $title;
}
/**
* @param string $band
*/
public function setBand($band)
{
$this->band = $band;
}
public function addTrack($track)
{
$this->tracks[] = $track;
}
}
/*
* 查看上述共性和认识到只可能存在两种CD类型之后,似乎我们只需要创建条件语句。如果CD类型是增强型CD,那么就创建
enhancedCD类的新实例;
* 否则,就应创建通用的CD类。然而,还存在更好的解决方案:使用工厂设计模式。
*
* CDFactory类使用了PHP根据变量动态实例化一个类的能力。create()方法接受被请求类的类型并返回该类的一个实例:
*
* */
class CDFactory
{
public static function create($type)
{
$class = strtolower($type) . 'CD';
return new $class;
}
}
//现在,类的创建和执行的变化反应了Factory类的用法:
$type = 'enhanced';
$cd = CDFactory::create($type);
$cd->setBand($band);
$cd->setTitle($title);
foreach ($tracksFromExternalSource as $track) {
$cd->addTrack($track);
}
/*
* 最后需要考虑的可能是已有CD类的名称。为了使其统一,将类名改变为standardCD也许更有实际意义。确认这样不会
破坏代码中其它位置的其它功能性。此时,我们最好将CD的新实例修改为
* 使用CDFactory类。
*
* 请求需要某些逻辑和步骤才能确定基对象的类实例时,最佳的做法是使用一个基于工厂设计模式的类。
* */