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

齐天大圣
Libérer: 2023-04-09 12:22:01
original
1978 Les gens l'ont consulté

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]);
        }
    }
}
Copier après la connexion

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;
    }
}
Copier après la connexion

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);
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal