博客列表 >单例模式、工厂模式、MVC模式的原理与实现、外部对象的依赖注入--2019/08/06

单例模式、工厂模式、MVC模式的原理与实现、外部对象的依赖注入--2019/08/06

LISTEN的博客
LISTEN的博客原创
2019年08月07日 17:25:36692浏览

1、单例模式

实例

<?php
namespace _0806test;

/*
 * 单例模式
 * 1. 一个类, 仅允许被实例化一次, 即仅允许某个类创建一个实例
 * 2. 应用场景: 数据库连接, HTTP请求...
 */

class Demo1
{
    //1、 构造方法私有化 ,这样就能防止外部进行实例化
    private function __construct()
    {
    }

    private static $instance=null;

    // 2、生成当前类的唯一实例对象
    public static function getInstance()
    {
        // 如果当前类的实例为NULL,说明还没有被实例化过,是第一次,允许实例化
        if (is_null(self::$instance)){
            self::$instance=new self();
        }

        // 返回当前的实例给调用者
        return self::$instance;
    }

    //  3、 禁用外部的clone方式创建新对象 ,禁用方法就是改成私有化private ,这样外部就不能访问了
    private function __clone()
    {
        echo '外部的clone方法被调用了.<br>';
    }

}

//$obj1=new Demo1();//由于构造方法被私有化,就不能实例化类

$obj1=Demo1::getInstance();
var_dump($obj1);
echo '<br>';

$obj2=Demo1::getInstance();
var_dump($obj2);
echo '<br>';

var_dump($obj1 === $obj2);//同一个实例化对象

echo '<hr>';

// 引用赋值
$obj3 = $obj1;
var_dump($obj3);
echo '<br>';
var_dump($obj1 === $obj3);//同一个实例化对象

echo '<hr>';

//$obj4 = clone $obj1;//如果clone 不被禁用的话,那就是两个不一样的实例化对象
//var_dump($obj4);

运行实例 »

点击 "运行实例" 按钮查看在线实例


2、工厂模式

实例

<?php
namespace _0806test;

/**
 * 工厂模式
 * 主要用于批量创建对象,使创建对象的过程剥离出来,标准化
 * 适合于一个类有多个实例, 而这些实例会在不同的地方被创建和引用
 * 使用工厂模式来创建对象, 可以实现, 一处修改, 全局生效
 */

class Test1
{
    public function __construct($arg1)
    {
        echo  '对象创建成功, 参数是: ' . $arg1;
    }
}

class Test2
{
    public function __construct($arg1,$arg2)
    {
        echo  '对象创建成功, 参数是: ' ***plode(',',[$arg1,$arg2]);
    }
}

class Test3
{
    public function __construct($arg1, $arg2, $arg3)
    {
        echo  '对象创建成功, 参数是: ' . implode(', ',[$arg1, $arg2, $arg3]);
    }
}

class Test4
{
    public function __construct()
    {
        echo  '对象创建成功, 无参数~~';
    }
}

// 工厂类: 专用用实例化类
class Factory
{
    /**
     * @param $className: 需要实例化的类名称
     * @param mixed ...$arguments: 实例化传给构造方法的参数
     * @return object 类实例
     */
    public static function create($className,...$arg)
    {
        return new $className(...$arg);
    }
}
//echo Test1::class;
//$obj1=Factory::create(__NAMESPACE__."\\".'Test1',100);
$obj1=Factory::create(Test1::class,100);
echo '<br>';
$obj2=Factory::create(Test1::class,200);
echo '<br>';
var_dump($obj1);
echo '<br>';
var_dump($obj2);
echo '<hr>';

$obj3=Factory::create(Test2::class,100,200);
echo '<br>';
var_dump($obj3);
echo '<hr>';

Factory::create(Test3::class, 100, 200, 300);

echo '<hr>';

Factory::create(Test4::class);

运行实例 »

点击 "运行实例" 按钮查看在线实例


3、MVC模式的原理与实现

model.php

实例

<?php
// 模型类: 用于数据库操作,数据访问

class Model
{
    protected $pdo;
    public function __construct()
    {
        $this->pdo=new \PDO('mysql:host=localhost;dbname=listen0724','root','root');
    }

    public function getData()
    {
        $sql='select `detail_id`,`name`,concat(left(`detail`,30),\'...\') as `detail` from `details`';
        $stmt=$this->pdo->prepare($sql);
        $stmt->execute();
        $res=$stmt->fetchAll(\PDO::FETCH_ASSOC);
        return $res;
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

view.php

实例

<?php
// 视图类: 渲染数据

class View
{
    public function fetch($data)
    {
        $table = '<table border="1" cellspacing="0" align="center" cellpadding="3" width="800" style="text-align: center">';
        $table .= '<caption>信息列表</caption>';
        $table.=' <thead><tr bgcolor="#00F7DE"><th>序号</th><th>名称</th><th>详情</th></tr></thead>';
        $table.= '<tbody >';

        foreach ($data as $detail){
            $table.='<tr>';
            $table.='<td>'.$detail['detail_id'].'</td>';
            $table.='<td>'.$detail['name'].'</td>';
            $table.='<td>'.$detail['detail'].'</td>';
            $table.='</tr>';
        }
        $table.='</tbody></table>';

        return $table;

    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例


控制器方法1

实例

<?php
// 控制器1

// 加载模型类
require 'Model.php';

// 加载视图类
require 'View.php';

// 控制器类
class Controller
{
    public function index()
    {
        // 1获取数据
        $model=new Model();
        $data=$model->getData();

        // 2渲染模板
        $view=new View();
        return $view->fetch($data);
    }
}

// 客户端调用
$controller=new Controller();
echo $controller->index();

运行实例 »

点击 "运行实例" 按钮查看在线实例

控制器方法2

实例

<?php
// 控制器2: 依赖注入, 解决了对象之间的高度耦合的问题


// 加载模型类
require 'Model.php';

// 加载视图类
require 'View.php';

// 控制器类
class Controller
{
    // 普通方法中实现了依赖注入
    // 注入点是一个普通方法
    public function index(Model $model,View $view)
    {
        // 1获取数据
        $data=$model->getData();

        // 2渲染模板
        return $view->fetch($data);
    }
}

// 客户端调用
$controller=new Controller();
$model=new Model();
$view=new View();
echo $controller->index($model,$view);

运行实例 »

点击 "运行实例" 按钮查看在线实例

控制器方法3--外部对象的依赖注入

实例

<?php
// 控制器2: 依赖注入

// 加载模型类
require 'Model.php';

// 加载视图类
require 'View.php';

// 控制器类
class Controller
{
    protected $model;
    protected $view;

    // 注入点是一个构造方法
    public function __construct(Model $model,View $view)
    {
        $this->model=$model;
        $this->view=$view;
    }

    public function index()
    {
        // 1获取数据
        $data=$this->model->getData();

        // 2渲染模板
        return $this->view->fetch($data);
    }
}

// 客户端调用
$model=new Model();
$view=new View();

$controller=new Controller($model,$view);
echo $controller->index();

运行实例 »

点击 "运行实例" 按钮查看在线实例

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议