php工厂模式及laravel中工厂模式

工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类

应用场景:连接数据库,可以使用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();
        }
}

猜你喜欢

转载自blog.csdn.net/qq_40876291/article/details/86490266
今日推荐