PHP设计模式理解

PHP常用的三种模式

  1. 工厂模式:工厂方法或类生成对象,而不是直接NEW对象

  2. 单例模式:使某个对象仅允许创建一个,而不是多次创建

  3. 注册树模式:解决全局共享和交换对象

1.工厂模式

新建一个类Factory.php

PHP设计模式理解  php设计模式 PHP的进阶之路 PHP工厂模式 PHP单例模式 PHP注册树模式 注册树模式 工厂模式 单例模式 第1张

1.首先我们在不使用工厂模式的情况下,我们想要操作Datebase类我们只能直接NEW一个对象,

也就是:

$db=new \Common\Datebase();

那么我们在使用工厂模式之后我们的代码应该怎么写?

我们在工厂类中新建静态发放:Factory.php

<?php


namespace Nphp;


use Common\Datebase;

class Factory
{
    static function createDatabase()
    {
        $db = new Datebase();
        return $db;
    }
}

然后刚才那个实现方法我们就可以直接改成:

$db=\Nphp\Factory::createDatabase();

工厂的好处:如果说,比如这个数据库类在很多地方都需要new 那么在后期维护的时候如果这个DB类需要修改名字或者修改数据,你在很多个PHP文件中都执行了NEW操作 那么维护起来就是很不方便的需要修改多个地方

2.单例模式

例如我们这个DB类,在使用过程中 如果每次都是new的话会创建多个数据库连接,这样会对服务器的开销造成很大的影响!

PHP设计模式理解  php设计模式 PHP的进阶之路 PHP工厂模式 PHP单例模式 PHP注册树模式 注册树模式 工厂模式 单例模式 第2张

实际上我们在创建过程中只需要创建一次连接

那么我们应该如何操作单例模式呢?

  1. PHP设计模式理解  php设计模式 PHP的进阶之路 PHP工厂模式 PHP单例模式 PHP注册树模式 注册树模式 工厂模式 单例模式 第3张

  2. 此时我们看到工厂模式里面已经不允许new操作了,也就是说我们在其他地方已经屏蔽了新建操作 

    PHP设计模式理解  php设计模式 PHP的进阶之路 PHP工厂模式 PHP单例模式 PHP注册树模式 注册树模式 工厂模式 单例模式 第4张

  3. 我们此时再修改内容

  4. <?php
    
    
    namespace Common;
    
    
    class Datebase
    {
        //声明一个熟悉 一定要是保护或者私有
        protected static $db;
    
        //一定要将构造方法声明为私有的
        private function __construct()
        {
    
        }
    
        //声明一个方法NEW本身
        static function getInstance()
        {
            //进行判断是否存在
            if (self::$db) {
                //存在本身就返回属性
                return self::$db;
            } else {
                //不存在
                //将自身赋值给自身的一个属性
                self::$db = new self();
                return self::$db;
            }
    
        }
    
        //查询条件
        function where($where)
        {
            return $this;
        }
    
        //排序
        function order($order)
        {
            return $this;
        }
    
        //条数
        function limit($limit)
        {
            return $this;
        }
    }

    那么最后在使用的时候:

    PHP设计模式理解  php设计模式 PHP的进阶之路 PHP工厂模式 PHP单例模式 PHP注册树模式 注册树模式 工厂模式 单例模式 第5张

    无论我们创建多少次也只会连接一次,这样的话就会大大减少服务器的资源的消耗。我们就将单例模式和工厂模式结合起来

3.注册树模式(将一些对象注册到全局树上,要用的时候随便取)

无论在使用单例或者工厂方法的确定:我们必须去调用这个工厂或者这个类,我们使用注册树模式就可以直接调用这个对象

什么一个新的类

<?php


namespace Nphp;

/**
 * Class Register
 * @package Nphp
 * 注册树模式
 */
class Register
{
    //数组
    protected static $objects;

    /**
     * @param $alias[别名]
     * @param $object[对象]
     * 将对象注册到全局注册树
     */
    static function set($alias,$object){
        //将对象映射到注册树上
        self::$objects[$alias]=$object;
    }

    /**
     * @param $alias[对象别名]
     * @return mixed[返回对象]
     * 取出对象使用
     */
    static function get($alias){
        return self::$objects[$alias];
    }

    /**
     * @param $alias[别名]
     * 将对象去移除注册树
     */
    function _unset($alias){
        unset(self::$objects[$alias]);
    }
}

那么我们在工厂模式里面就注册一下

<?php


namespace Nphp;


use Common\Datebase;

class Factory
{
    static function createDatabase()
    {
        $db = Datebase::getInstance();
        //注册到全局树上去 db1代表别名
        Register::set('db1',$db);
        return $db;
    }
}

最后在使用的时候 我们直接从树上取出来

$db=\Nphp\Register::get('db1');

具体如何注册和卸载可以由我们在业务初始化中完成,在业务逻辑中我们只需要取出来使用即可

打赏

本文 暂无 评论

回复给

Top