PHP设计模式八注册树模式

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

课程背景

  • 最近完成一个项目 对于代码分层有了一丢丢了解 但是架构设计合理性上存在问题
  • 万物看本质基本功硬 底层知识扎实才能写出更优质的代码 才能走得更远
  • 作为努力奔跑的程序员 又一次的去温习 思考 设计模式等基础的php知识
  • 因为掘金粑粑有奖励,所以把学习的笔记整理记录并分享了出来。

正文开始

前面我们介绍了单例模式 工厂模式。

  • 类先实现单例模式保证每次请求只会初始化一次,节约系统高性能
  • 工厂模式中定义统一的方法获取单例中的实例。

这里继续编写下一层,注册树模式。

介绍

如果每一个地方都直接调用工厂创建对象,那每次使用的时候都得去调用工厂模式创建。我们可以把最基本的,常用的类。放在一颗树上,并在初始方法中完成所有基本类的初始化。这样当我们需要使用某一个类的时候,直接从树上拿下一个直接使用即可。

开始编写

Register.php

<?php
namespace Liiy;

class Register{

    protected static $objects;  //保存所有的数组

    //设置变量
    public static function set($alias, $object){
        if(!self::$objects[$alias]){
            self::$objects[$alias] = $object;
        }
    }

    //获取变量
    public static function get($alias){
        return self::$objects[$alias];
    }

    //卸载类
    public static function _unset($alias){
        unset(self::$objects[$alias]);
    }
}
复制代码

注册树定义以后,只是定义了入口出口。具体树上要放些啥内容。还是要看开发者如何去定义的。
此时我们假设在创建db的时候把它添加到注册数中。

<?php
namespace Liiy;

class Factory{

    public static function createDb(){
        $db = Db::getInstance();
        Register::set('db1',$db); //添加到注册树中

        return $db;
    }
}
复制代码

那样在入口文件中,我们就可以直接通过别名,拿到想要的实例对象了。

Factory::createDb();  //具体的初始化业务而定
$db = Register::get('db1');
var_dump($db);
复制代码

image.png