Skip to content

抽象工厂模式是一种创建型的设计模式,它提供了一种创建对象的最佳方式。抽象工厂模式主要用于解决创建一系列相互依赖的对象的问题,他是一个用于创建其他工厂的超级工厂。

抽象工厂模式的意图在于:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,它主要解决的问题是对象的选择性问题。它的关键在于 - 在一个工厂里聚合多个同类产品。

抽象工厂模式的优点在于,能够创建多个一起工作的对象模型,能够保证客户端始终只使用同一个产品族中的对象。

抽象工厂的缺点在于,产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的创建者里加代码,又要在具体的实践里面加代码。

注:示例代码省略了 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();
    }
}