抽象工厂模式是一种创建型的设计模式,它提供了一种创建对象的最佳方式。抽象工厂模式主要用于解决创建一系列相互依赖的对象的问题,他是一个用于创建其他工厂的超级工厂。
抽象工厂模式的意图在于:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,它主要解决的问题是对象的选择性问题。它的关键在于 - 在一个工厂里聚合多个同类产品。
抽象工厂模式的优点在于,能够创建多个一起工作的对象模型,能够保证客户端始终只使用同一个产品族中的对象。
抽象工厂的缺点在于,产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的创建者里加代码,又要在具体的实践里面加代码。
注:示例代码省略了 ApptEncode 接口和其系列实现类 MegaApptEncode 等等
php
//comms 对象的创建接口
abstract class CommsManager {
const APPT = 1;
const TTD = 2;
const CONTACT = 3;
abstract function getHeaderText();
abstract function make ( $flag_init );
abstract function getFooterText();
}
//bloggs encode 对象的创建工厂
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";
}
}
//mega encode的对象创建方法
class MegaCommsManager extends CommsManager {
function getHeaderText()
{
return "MegaCal Header\n";
}
function make( $flag_init )
{
switch ($flag_init) {
case self::APPT:
return new MegaApptEncoder();
case self::TTD:
return new MegaTtdEncoder();
case self::CONTACT:
return new MegaContactEncoder();
}
}
function getFooterText()
{
return "MegaCal Header\n";
}
}
//获取工厂类用于获取工厂
class CommsFactory
{
public function getCommsFactory($name)
{
if($name=='bloggs'){
return new BloggsCommsManager();
}
if($name=='mega'){
return new MegaCommsManager();
}
}
}
//示例
class Demo{
public function demo()
{
$factory = new CommsFactory('mega');
//megaappt
$encode = $factory->make(1);
$encode->encode();
//megattd
$encode = $factory->make(2);
$encode->encode();
//megacontact
$encode = $factory->make(3);
$encode->encode();
$factory = new CommsFactory('bloggs');
//bloggsappt
$encode = $factory->make(1);
$encode->encode();
//bloggsttd
$encode = $factory->make(2);
$encode->encode();
//bloggscontact
$encode = $factory->make(3);
$encode->encode();
}
}