「PHP」抽象工厂模式

引言
 
  所属:创建型模式,常用设计模式之一
  
  参考资料:
    • 《大话设计模式》程杰
 
模式概述
  
  官方定义:抽象工厂模式(Abstract Factory),提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
  
  大意:创建一个约束接口,相关功能去按照接口规范实现这个接口达到统一;
  
举个栗子
 
    模拟场景:两个甲方,分别为甲方A,甲方B,甲方A使用MySQL数据库,甲方B使用Oracle,由于两种数据库的SQL查询语句语法有部分不一致,这时要同时编写【用户类】,【订单类】,如果用抽象工厂实现?
 
    流程图如下:
      
          「PHP」抽象工厂模式
    
程序设计代码:
 
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