Heim >Backend-Entwicklung >PHP-Tutorial >Verwenden Sie den Registrierungsbaum und das Factory-Muster anstelle der Singleton-Musterpraxis (mit Fall).

Verwenden Sie den Registrierungsbaum und das Factory-Muster anstelle der Singleton-Musterpraxis (mit Fall).

齐天大圣
齐天大圣Original
2020-08-04 09:09:242005Durchsuche

Heute werde ich Ihnen das nächste strukturelle Entwurfsmuster auf der chinesischen PHP-Website vorstellen – den Registrierungsbaummodus, den Alias-Registrierungsmodus oder den Registrierungsmodus, der zum Speichern von Instanzen von Objekten verwendet wird, die häufig in Programmen verwendet werden. Der Registrierungsbaummodus registriert Objektinstanzen in einem globalen Objektbaum und wählt sie bei Bedarf aus dem Objektbaum aus. Aber anders als beim Pflücken in der Realität sind die vom Zielbaum gepflückten Früchte immer noch am Zielbaum vorhanden, und Sie können sie beim nächsten Mal weiter pflücken.

Implementierungscode

Das Registrarmuster ist sehr einfach zu verstehen und zu implementieren. Im Allgemeinen gibt es ein Attribut zum Speichern mehrerer Objektinstanzen sowie Set- und Get-Methoden. Die Set-Methode wird verwendet, um die Objektinstanz im Attributarray zu speichern, und die Get-Methode wird verwendet, um die gewünschte Objektinstanz abzurufen.

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]);
        }
    }
}

Registrierungsbaummodus und Factory-Modus anstelle des Singleton-Modus verwenden

Wir wissen, dass Singleton sehr nützlich ist und Ressourcenverschwendung usw. vermeiden kann. Das Singleton-Muster wurde jedoch als negatives Muster betrachtet und es gilt als schwierig, das Singleton-Muster zu testen und beizubehalten. Warum das Singleton-Muster als Anti-Muster gilt, möchte ich hier nicht näher erläutern. Interessierte Freunde können es selbst googeln.

Gibt es also andere Möglichkeiten, einen Singleton sicherzustellen, ohne das Singleton-Muster zu verwenden? Ja, wir können den Registrierungsbaummodus und den Factory-Modus verwenden, um den Singleton-Modus zu ersetzen. Das Folgende ist der spezifische Code:

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;
    }
}

Wenn wir eine Db-Instanz benötigen, müssen wir nur DbFactory::create aufrufen. Diese Methode garantiert einen Singleton. Das Folgende ist der Testcode:

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

Verwandte Empfehlungen:

1.PHP-Designmuster, einfaches Fabrikmuster

2 . Einfache Fabrik, Fabrikmethode und abstrakte Fabrik in einem Artikel verstehen

3.Das Proxy-Muster des PHP-Entwurfsmusters in einem Artikel verstehen

4.PHP-Designmuster: Lernerfahrung im Bridge-Modus (mit Fallcode)

Das obige ist der detaillierte Inhalt vonVerwenden Sie den Registrierungsbaum und das Factory-Muster anstelle der Singleton-Musterpraxis (mit Fall).. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn