所属:创建型模式,常用设计模式之一
参考资料:
-
- 《大话设计模式》程杰
官方定义:抽象工厂模式(Abstract Factory),提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
大意:创建一个约束接口,相关功能去按照接口规范实现这个接口达到统一;
模拟场景:两个甲方,分别为甲方A,甲方B,甲方A使用MySQL数据库,甲方B使用Oracle,由于两种数据库的SQL查询语句语法有部分不一致,这时要同时编写【用户类】,【订单类】,如果用抽象工厂实现?
流程图如下:
1. 产品类接口
<?php /** * 用户产品类具体操作接口 */ namespace abstract_factory; interface UserInterface { /** * 查询操作接口 * @return mixed */ public function select(); /** * 插入操作接口 * @return mixed */ public function insert(); }
<?php /** * 订单产品类具体操作接口 */ namespace abstract_factory; interface OrderInterface { /** * 查询操作接口 * @return mixed */ public function select(); /** * 插入操作接口 * @return mixed */ public function insert(); }
2. 具体产品操作类
<?php /** * MySQL 订单产品类具体操作 */ namespace abstract_factory; class MysqlOrder { /** * 查询具体操作 */ public function select() { echo '订单表查询'; } /** * 插入具体操作 */ public function insert() { echo '订单表插入'; } }
<?php /** * MySQL 用户产品类具体操作 */ namespace abstract_factory; class MysqlUser { /** * 查询操作 */ public function select() { echo '订单表查询'; } /** * 插入操作 */ public function insert() { echo '订单表插入'; } }
<?php /** * Oracle 订单产品类具体操作 */ namespace abstract_factory; class OracleOrder { /** * 查询具体操作 */ public function select() { echo '订单表查询'; } /** * 插入具体操作 */ public function insert() { echo '订单表插入'; } }
<?php /**e * Oracle 用户产品类具体操作 */ namespace abstract_factory; class OracleUser { /** * 查询操作 */ public function select() { echo '用户表查询'; } /** * 插入操作 */ public function insert() { echo '用户表插入'; } }
3. 定义需要实例产品类的工厂类接口数量
<?php /** * 定义需要实例产品类的工厂类接口数量 */ namespace abstract_factory; interface DBFactoryInterface { /** * 用户工厂类接口 * @return mixed */ public function createUser(); /** * 订单工厂类接口 * @return mixed */ public function createOrder(); }
4. 包装产品类升级为工厂类
<?php /** * MySQL操作 包装产品类升级为工厂类 */ namespace abstract_factory; class MysqlFactory implements DBFactoryInterface { /** * 用户产品类 * @return MysqlUser */ public function createUser() { return new MysqlUser(); } /** * 用户产品类 * @return MysqlOrder */ public function createOrder() { return new MysqlOrder(); } }
<?php /** * Oracle操作 包装产品类升级为工厂类 */ namespace abstract_factory; class OracleFactory implements DBFactoryInterface { /** * 用户产品类 * @return OracleUser */ public function createUser() { return new OracleUser(); } /** * 订单产品类 * @return OracleOrder */ public function createOrder() { return new OracleOrder(); } }
GitHub源码地址:https://github.com/xiaobaoword/design_pattern/tree/master