【原】PHP设计模式-工厂模式

/ 0评 / 1

本文介绍PHP中的工厂模式,同时以tp5.1框架里面的加载配置文件举例并介绍工厂模式该如何使用。下面实现一个简单的工厂模式
首先写基础工厂类

namespace app\index\controller;
class Factory
{
    public function buyCar($car)
    {
         //此处拼接命名空间
        $name = "app\index\controller\\" . $car;
        $product = new $name();
        $cara = $product->output();
        return $cara;
    }
}

注:因为在thinkphp5框架里做测试,此处会有命名空间,如果在其它的地方使用,根据现场情况更改即可,此文只做个示例。
生产宝马车类 :

namespace app\index\controller;
class Bmw
{
    protected $product ="";
    public function __construct()
    {
        //生产宝马车
        $this->product = "宝马";
    }
    public function output(){
        return $this->product;
    }
}

生产奔驰车类:

namespace app\index\controller;
class Benz
{
    protected $product = "";
    public function __construct()
    {
        //生产奔驰
        $this->product =  '奔驰';
    }
    public function output(){
        return $this->product;
    }
}

生产奥迪车类:

namespace app\index\controller;
class Audi
{
    protected $product = "";
    public function __construct()
    {
        $this->product =  "奥迪";
    }
    public function output(){
        return $this->product;
    }
}

实现功能:

$factory = new Factory();
$car = $factory->buyCar('Audi');
$car = $factory->buyCar('Bmw');
$car = $factory->buyCar('benz');
print_r($car);

结果输出

奥迪
宝马
奔驰

工厂模式常用场景介绍:

  1. 调用多种数据库类型的地方,如当前系统同时要使用MySQL、pgsql、MongoDB等,可以将每个连接数据库的驱动类携程工厂模式的方式使用。
  2. 加载多种不同的配置文件,如thinkphp框架里的配置加载,配置文件会有:PHP、json、ini、xml等,使用工厂模式自动加载。
  3. 针对系统的不同角色用户渲染页面时显示的内容不一样,此处也可以使用工厂模式,系统需要新增角色权限时只需要添加对应角色的工厂类,而不需要修改原有系统代码。

下面以thinkphp中的配置文件加载举例说明

首先查看/think/library/think/Config.php这个文件中的loadFile方法。

protected function loadFile($file, $name)
{
    $name = strtolower($name);
    $type = pathinfo($file, PATHINFO_EXTENSION);
    if ('php' == $type) {
        return $this->set(include $file, $name);
    } elseif ('yaml' == $type && function_exists('yaml_parse_file')) {
        return $this->set(yaml_parse_file($file), $name);
    }
    return $this->parse($file, $type, $name);
}

这个方法是用来加载配置文件相关驱动的方法此处可将PHP格式的配置文件加载方法写成驱动放到 /think/library/think/config/driver目录里
示例如下:

namespace think\config\driver;
class Php
{
    protected $config;
    public function __construct($config)
    {
        if (is_file($config)){
                        //加载文件
            $config = include  $config;
        }
        $this->config = $config;
    }
    public function parse(){
        //输出
        return $this->config;
    }
}

将PHP文件的加载方法写成了驱动后,原有的PHP判断就可以删掉了,下面这一段 。

if ('php' == $type) {
        return $this->set(include $file, $name);
    }

同时yaml配置文件的样式类似,此处不做介绍。

以上是关于平PHP设计模式——工厂模式的介绍,如有转载请注明出处。

及时了解关于PHP和golang的一些技术文章请关注微信公众号:文艺的爱码士