Maison >développement back-end >tutoriel php >Utiliser l'arbre d'enregistrement et le modèle d'usine au lieu de la pratique du modèle singleton (avec cas)

Utiliser l'arbre d'enregistrement et le modèle d'usine au lieu de la pratique du modèle singleton (avec cas)

齐天大圣
齐天大圣original
2020-08-04 09:09:241983parcourir

Aujourd'hui, je vais vous présenter le prochain modèle de conception structurelle sur le site Web chinois PHP - le mode arborescence d'enregistrement, le mode d'enregistrement d'alias ou le mode d'enregistrement, qui est utilisé pour enregistrer des instances d'objets fréquemment utilisés dans les programmes. Le mode arborescence d'enregistrement enregistre les instances d'objet dans une arborescence d'objets globale et les sélectionne dans l'arborescence d'objets si nécessaire. Mais contrairement à la cueillette dans la réalité, les fruits cueillis sur l’arbre cible existent toujours sur l’arbre cible et vous pourrez continuer à les cueillir la prochaine fois.

Code d'implémentation

Le modèle de registraire est très facile à comprendre et à mettre en œuvre. Généralement, un attribut sera utilisé pour stocker plusieurs instances d'objet, ainsi que des méthodes set et get. La méthode set est utilisée pour enregistrer l'instance d'objet dans le tableau d'attributs et la méthode get est utilisée pour obtenir l'instance d'objet souhaitée.

class Registry
{
    // 保存实例对象
    private static $objs = [];
    
    // get获取实例对象
    public static function get(string $alias) : Object
    {
        if (!isset(self::$objs[$alias])) {
            throw new \Exception($alias . 'not found');
        }
        
        return self::$objs[$alias];
    }
    
    // set将实例对象注册到属性$objs中
    public static function set (string $alias, Object $obj) : void
    {
        if (!isset(self::$objs[$alias])) {
            self::$objs[$alias] = $obj;
        }
    }
    
    // 注销实例
    public static function unset (string $alias) :void
    {
        if (isset(self::$objs[$alias])) {
            unset(self::$objs[$alias]);
        }
    }
}

Utilisez le mode arbre d'enregistrement et le mode usine au lieu du mode singleton

Nous savons que le singleton est très utile et peut éviter le gaspillage de ressources, etc. Cependant, le modèle singleton a été considéré comme un modèle négatif et il est considéré comme difficile de tester et de maintenir le modèle singleton. Quant à savoir pourquoi le modèle singleton est considéré comme un anti-modèle, je n'entrerai pas dans les détails ici. Les amis intéressés peuvent le rechercher eux-mêmes sur Google.

Alors, existe-t-il d'autres moyens de garantir un singleton sans utiliser le modèle singleton ? Oui, nous pouvons utiliser le mode arbre d'enregistrement et le mode usine pour remplacer le mode singleton. Voici le code spécifique :

class Registry
{
    // 保存实例对象
    private static $objs = [];
    
    // get获取实例对象
    public static function get(string $alias) 
    {
        if (!isset(self::$objs[$alias])) {
            return null;
        }
        return self::$objs[$alias];
    }
    
    // set将实例对象注册到属性$objs中
    public static function set (string $alias, Object $obj) : void
    {
        if (!isset(self::$objs[$alias])) {
            self::$objs[$alias] = $obj;
        }
    }
    
    // 注销实例
    public static function unset (string $alias) :void
    {
        if (isset(self::$objs[$alias])) {
            unset(self::$objs[$alias]);
        }
    }
}

class DbFactory
{
    const ALIAS = 'Db';
    
    public static function create ()
    {
        $db = Registry::get(self::ALIAS);
        if (!$db) {
            $db = new Db([
                'host' => 'localhost',
                'user' => 'root',
                'pass' => '',
                'db_name' => 'test'
            ]);
            Registry::set(self::ALIAS, $db);
        }
        
        return $db;
    }
}

Lorsque nous avons besoin d'une instance Db, il suffit d'appeler DbFactory::create. Cette méthode garantit un singleton. Voici le code de test :

$db = DbFactory::create();
var_dump($db);

Recommandations associées :

1.Modèle de conception PHP modèle d'usine simple

2 . Comprendre l'usine simple, la méthode d'usine, l'usine abstraite dans un article

3.Comprendre le modèle de proxy du modèle de conception PHP dans un article

4.Modèle de conception PHP : expérience d'apprentissage en mode pont (avec code de cas)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn