// 抽象工厂模式
abstract class CommsManager {
abstract function getHeaderText();
abstract function getApptEncoder();
abstract function getTtdEncoder();
abstract function getContactEncoder();
abstract function getFooterText();
}
class BloggsCommsManager extends CommsManager {
function getHeaderText()
{
return "BloggsCal Header\n";
}
function getApptEncoder()
{
return new BloggsApptEncoder();
}
function getTtdEncoder()
{
return new BloggsTtdEncoder();
}
function getContactEncoder()
{
return new BloggsContactEncoder();
}
function getFooterText()
{
return "BloggsCal Footer\n";
}
}
class MegaCommsManager extends CommsManager {
function getHeaderText()
{
return "MegaCal Header\n";
}
function getApptEncoder()
{
return new MegaApptEncoder();
}
function getTtdEncoder()
{
return new MegaTtdEncoder();
}
function getContactEncoder()
{
return new MegaContactEncoder();
}
function getFooterText()
{
return "MegaCal Footer\n";
}
}
//当然需要添加对应的TtdEncoder抽象类和ContactEncoder抽象类,以及他们的子类。
好啦,到这里就算是差不多结束了工厂模式的变形过程,我们可以来简单归纳下这个变形过程中的核心,如下:
1.将系统和实现的细节分离开,我们可在示例中移除或者添加任意数目的编码格式而不会影响系统。
2.对系统中功能相关的元素强制进行组合,因此,通过使用BloggsCommsManager,可以确定只使用与BloggsCal有关的类。
3.添加新产品时将会令人苦恼,因为不仅需要创建新产品的具体实现,而且为了支持它,我们必须修改抽象创建者和它的每个具体实现。
当然,我们可以创建一个标志参数来决定返回什么对象的单一的make()方法,而不用给每个工厂创建独立的方法,如下:
abstract class CommsManager {
const APPT = 1;
const TTD = 2;
const CONTACT = 3;
abstract function getHeaderText();
abstract function make ( $flag_init );
abstract function getFooterText();
}
class BloggsCommsManager extends CommsManager {
function getHeaderText()
{
return "BloggsCal Header\n";
}
function make( $flag_init )
{
switch ($flag_init) {
case self::APPT:
return new BloggsApptEncoder();
case self::TTD:
return new BloggsTtdEncoder();
case self::CONTACT:
return new BloggsContactEncoder();
}
}
function getFooterText()
{
return "BloggsCal Header\n";
}
}
此时,如果还需要添加交流其它的数据,此时只需在抽象创造者中添加一个新的flag_init标识,并在子创造者中的make方法中添加一个条件,相比来说比原先的更加容易扩展,只需修改少数地方即可。
