抽象工厂模式(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();
工厂方法与抽象工厂比较:
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。