【PHP设计模式】创建型之抽象工厂(abstract factory)

抽象工厂模式(abstract factory):

意图:

  【GoF】提供一个创建一系列相关或相互依赖的接口,而无需指定他们具体的类

动机:

   把创建者与产品实现分离。

适用:

  一、一个系统要独立于它的产品的创建、组合与表示时。

  二、一个系统要由多个产品系列中的一个来配置时。

  三、当你要强调一系列相关产品对象的设计以便进行联合使用时。

  四、当你提供一个产品类库,而指向显示它们的接口而不是实现时。

结构图:

  AbstractFactory:负责创建一个抽象产品对象的接口。CreateFactory:实现创建具体产品对象。AbstractFactory:为一类产品对象创建一个接口。ProductA1:定义一个将被具体的工厂创建的产品对象。

  在运行时刻创建一个CreateFactory的实例,这一个具体的工厂对象创建具有特定实现的产品对象。为创建不同的产品对象,客户使用不同的具体工厂。

示例代码一:

//抽象预约类
abstract class ApptEncoder {
    abstract function encode();
}
//抽象代办事宜类
abstract class TtdEncoder {
    abstract function encode();
}
//抽象联系人类
abstract class ContactEncoder {
    abstract function encode();
}
//具体预约类
class BloggsApptEncoder extends ApptEncoder {
    function encode() {
        return "Appointment data encoded in BloggsCal format
";
    }
}
//抽象代办事宜类
class BloggsContactEncoder extends ContactEncoder {
    function encode() {
        return "Contact data encoded in BloggsCal format
";
    }
}
//抽象联系人类
class BloggsTtdEncoder extends ApptEncoder {
    function encode() {
        return "Things to do data encoded in BloggsCal format
";
    }
}
//具体日历预约类
class MegaApptEncoder extends ApptEncoder {
    function encode() {
        return "Appointment data encoded in MegaCal format
";
    }
}
//抽象工厂类
abstract class CommsManager {
    const APPT    = 1;
    const TTD     = 2;
    const CONTACT = 3;
    abstract function getHeaderText();
    abstract function make( $flag_int );
    abstract function getFooterText();
}
//具体工厂类
class BloggsCommsManager extends CommsManager {
    function getHeaderText() {
        return "BloggsCal header
";
    }

    function make( $flag_int ) {
        switch ( $flag_int ) {
            case self::APPT:
                return new BloggsApptEncoder();
            case self::CONTACT:
                return new BloggsContactEncoder();
            case self::TTD:
                return new BloggsTtdEncoder();
        } 
    }

    function getFooterText() {
        return "BloggsCal footer
";
    }
}

$comms = new BloggsCommsManager();
print $comms->getHeaderText();
print $comms->make( CommsManager::APPT )->encode();
print $comms->make( CommsManager::TTD )->encode();
print $comms->make( CommsManager::CONTACT )->encode();
print $comms->getFooterText();

 

工厂方法与抽象工厂比较:

工厂方法模式:

  一个抽象产品类,可以派生出多个具体产品类。

  一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:

   多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

  一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。

区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

 

 

原文地址:https://www.cnblogs.com/colorstory/p/2716749.html