抽象工厂模式
官方定义:抽象工厂模式(Abstract Factory),提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
大意:创建一个约束接口,相关功能去按照接口规范实现这个接口达到统一;
举例
模拟场景:两个甲方,分别为甲方A,甲方B,甲方A使用MySQL数据库,甲方B使用Oracle,由于两种数据库的SQL查询语句语法有部分不一致,这时要同时编写【用户类】,【订单类】,如果用抽象工厂实现?
实现
- 产品类接口
<?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();
}
- 具体产品操作类
<?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 '用户表插入';
}
}
- 定义需要实例产品类的工厂类接口数量
<?php
/**
* 定义需要实例产品类的工厂类接口数量
*/
namespace abstract_factory;
interface DBFactoryInterface
{
/**
* 用户工厂类接口
* @return mixed
*/
public function createUser();
/**
* 订单工厂类接口
* @return mixed
*/
public function createOrder();
}
- 包装产品类升级为工厂类
<?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();
}
}