工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类
应用场景:连接数据库,可以使用mysql 、mysqli、pdo,根据不同参数配置使用不同的数据库操作类
做支付接口的时候,未来可能对应不同的支付网关:支付宝、财付通、网银在线等。
方便未来扩展,设计成工厂模式。定一个专门生产网关接口的工厂,抽象出来,
做成接口形式,让所有的子类都要实现它的接口。
以后加一个支付方式,要使用哪一种支付方式,改变一下参数即可。
在为用户注册的时候,分为很多种角色的用户。
比如册用户,匿名用户、管理员用户等。完全使用可以使用工厂的思想来实现,
代码也容易维护,为每种角色可以生成操作的类等等。
<?php /** * Created by PhpStorm. * User: Ty_Ro * Date: 2019/1/15 * Time: 10:35 */ /** * 抽象产品(共同接口) * @定义一个工厂接口 */ interface mysql{ public function connect(); } /** * Class mysqli2 * 具体产品实现 * @实现这个接口 */ class mysqli2 implements mysql{ public function connect(){ echo 'mysqli'; } } /** * Class pdo2 * 具体产品实现 * @实现这个接口 */ class pdo2 implements mysql{ public function connect(){ echo 'pdo'; } } /** * Class mysqlFactory * 通过传入不同的参数来实例化不同的对象;统一在工厂类中进行实例化 */ class mysqlFactory{ static public function factory($class_name){ return new $class_name(); } } $obj = mysqlFactory::factory('pdo2'); $obj->connect();
class mysqlFactory{
static public function factory($class_name){
return new $class_name();
}
}
$obj = mysqlFactory::factory('pdo2');
$obj->connect();
在laravel中使用工厂模式需要注意命名空间,否则容易报错类找不到
工厂类:
<?php /** * Created by PhpStorm. * User: Ty_Ro * Date: 2019/1/15 * Time: 10:35 */ namespace App; interface mysql{ public function connect(); } class mysqli2 implements mysql{ public function connect(){ echo 'mysqli'; } } class pdo2 implements mysql{ public function connect(){ echo 'pdo'; } } class MyFactory { /** * @var array */ protected $typeList; /** * 你可以在这里注入自己的车子类型 */ public function __construct() { $this->typeList = array( 'pdo2' => __NAMESPACE__ . '\pdo2', 'mysqli2' => __NAMESPACE__ . '\mysqli2' ); } public function factory($type){ if (!array_key_exists($type, $this->typeList)) { throw new \InvalidArgumentException("$type is not valid vehicle"); } $className = $this->typeList[$type]; return new $className(); } }
调用工厂类
<?php /** * Created by PhpStorm. * User: Ty_Ro * Date: 2019/1/15 * Time: 10:27 */ namespace App\Http\Controllers\DesignMode; use App\Http\Controllers\Controller; use App\MyFactory; class FactoryPatternController extends Controller { public function newFactory() { $obj = new MyFactory; $obj->factory('pdo2')->connect(); } }