ホームページ > バックエンド開発 > PHPチュートリアル > シングルトン パターンの練習の代わりに登録ツリーとファクトリー パターンを使用する (ケース付き)

シングルトン パターンの練習の代わりに登録ツリーとファクトリー パターンを使用する (ケース付き)

齐天大圣
リリース: 2023-04-09 12:22:01
オリジナル
1982 人が閲覧しました

今日は、PHP 中国語 Web サイトの次の構造設計パターンである登録ツリー モード、エイリアス レジスタ モード、または登録モードを紹介します。これは、プログラムで頻繁に使用されるオブジェクトのインスタンスを保存するために使用されます。登録ツリー モードは、オブジェクト インスタンスをグローバル オブジェクト ツリーに登録し、必要に応じてオブジェクト ツリーから選択します。ただし、現実の摘み取りとは異なり、対象の木から摘んだ果実は対象の木にまだ存在しており、次回も引き続き摘み取ることができます。

実装コード

レジストラ パターンは、理解と実装が非常に簡単です。一般に、複数のオブジェクト インスタンスを格納するために使用される属性と、set メソッドと get メソッドがあります。 set メソッドはオブジェクト インスタンスを属性配列に保存するために使用され、get メソッドは目的のオブジェクト インスタンスを取得するために使用されます。

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]);
        }
    }
}
ログイン後にコピー

シングルトン モードの代わりに登録ツリー モードとファクトリー モードを使用してください

シングルトンは非常に便利で、リソースの無駄などを回避できることはわかっています。しかし、シングルトン パターンはネガティブなパターンと考えられており、シングルトン パターンのテストと維持は困難であると考えられています。シングルトン パターンがアンチパターンとみなされる理由については、ここでは詳しく説明しませんので、興味のある友人は自分でググってみてください。

それでは、シングルトン モードを使用せずにシングルトンを確保する他の方法はあるのでしょうか?はい、登録ツリー モードとファクトリー モードを使用してシングルトン モードを置き換えることができます。具体的なコードは次のとおりです:

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;
    }
}
ログイン後にコピー

Db インスタンスが必要な場合は、DbFactory::create を呼び出すだけで済みます。このメソッドはシングルトンを保証します。テスト コードは次のとおりです:

$db = DbFactory::create();
var_dump($db);
ログイン後にコピー

関連する推奨事項:

1.PHP デザイン パターン シンプル ファクトリ パターン

2 . 単純なファクトリ、ファクトリ メソッド、抽象ファクトリを理解するための 1 つの記事

3.PHP デザイン パターンのプロキシ パターンを理解するための 1 つの記事

4.php デザイン パターン: ブリッジ モードの学習体験 (ケース コード付き)

以上がシングルトン パターンの練習の代わりに登録ツリーとファクトリー パターンを使用する (ケース付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート