抽象工厂模式为一个产品族提供了统一的创建接口。当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个具体的工厂类。
什么是产品族?图上展示的是 Wechat产品下的预约、待办、联系人。它们之间虽然没有任何关系,但它们都实现了同一个 encoder()方法,而且它们在功能上是相似的。
而抽象接口 CommonsManager类定义了用于生成三种产品的接口。WechatCommonsManager则是具体产品的创建者。
interface CommonsManager{public function getApptEncoder(): ApptEncoder;public function getTtdEncoder(): TtdEncoder;public function getContactEncoder(): ContactEncoder;}
// 预约abstract ApptEncoder{public function encoder(): string;}// 待办abstract TtdEncoder{public function encoder(): string;}// 联系人abstract ContactEncoder{public function encoder(): string;}
class WechatApptEncoder extends ApptEncoder{public function encoder(): string{return 'This is Wechat ApptEncoder';}}class WechatTtdEncoder extends ApptEncoder{public function encoder(): string{return 'This is Wechat TtdEncoder';}}class WechatContactEncoder extends ApptEncoder{public function encoder(): string{return 'This is Wechat ContactEncoder';}}
class WechatCommonsManager implements{public function getApptEncoder(): ApptEncoder{return new WechatApptEncoder();}public function getTtdEncoder(): ApptEncoder{return new WechatTtdEncoder();}public function getContactEncoder(): ApptEncoder{return new WechatContactEncoder();}}
class Client{public static function main(){self::run(WechatCommonsManager);}public static function run(CommonsManager $manager){echo $manager->getApptEncoder()->encoder();echo $manager->getTtEncoder()->encoder();echo $manager->getContactEncoder()->encoder();}}// 运行Client::main();
