はじめに
シングルトン パターンとは、アプリケーション全体でクラスがオブジェクト インスタンスを 1 つだけ持つ設計パターンを指します。通常、オブジェクトを作成し、クラスのインスタンスが 1 つだけ存在することを確認し、自身をインスタンス化してこのインスタンスをシステム全体に提供するために使用されます。
これは、コンピューター システムでは、スレッド プール、キャッシュ、ログ オブジェクト、ダイアログ ボックス、プリンター、データベース操作、グラフィック カード ドライバーがシングルトンとして設計されることがよくあります。
特徴
クラスはアプリケーション全体で唯一のインスタンスを持ちます
クラスはこのインスタンスを自分で作成する必要があります
このインスタンスを自分でシステム全体に提供する必要があります
機能
を使用する最大の効果シングルトン パターンは、システム コストのオーバーヘッドを削減し、リソースを節約することです。たとえば、日常の開発で PHP を使用する場合、MySQL や Redis などのさまざまなリレーショナル データベースや非リレーショナル データベースに複数回接続する必要があることがよくあります。シングルトン モードを使用しない場合は、新規作成を複数回実行する必要があります。新しいインスタンスは、メモリ リソースとシステム リソースを大量に消費します。
ポイント
1. クラス
private static $_instance;
の唯一のインスタンスを保存するには、静的メンバー変数が必要です。2. コンストラクターとクローン関数は、新しいクラスからの外部プログラムが使用されないように、プライベートとして宣言する必要があります。これにより、シングルトンの意味が失われます。モード
// 私有化构造方法,防止new实例 private function __construct() { $this->_db = pg_connect('demo'); } // 覆盖__clone()方法,禁止克隆 private function __clone() { }
3. 固有のインスタンスへの参照を返すために、このインスタンスにアクセスするパブリック静的メソッド (通常は getInstance メソッド) を提供する必要があります
// 用于返回对象实例的公共静态方法 public static function getInstance() { // 判断当前实例是否已经创建 if (!(self::$_instance instanceof self) ) { // 如果没有,则创建 self::$_instance = new self(); } // 最终返回实例 return self::$_instance; }
説明
次に、MySQL 操作クラスを例として説明します。書き方。
コード:
<?php /** * Class DB 数据库操作类 */ class Db { private $_db; private static $_instance; // 私有化构造方法,防止外部new实例 private function __construct(...) { // 这里主要用于连接数据库,细节此处省略 $this->_db = pg_connect(...); } // 覆盖__clone()方法,禁止克隆 private function __clone() { } // 返回对象实例 public static function getInstance() { // 判断是否存在对象实例 if(! (self::$_instance instanceof self) ) { // 不存在则创建保存 self::$_instance = new self(); } // 返回对象实例 return self::$_instance; } // 其他方法 public function addUserInfo(...) { } // 其他方法 public function getUserInfo(...) { } } // 演示 $db = Db::getInstance(); $db->addUserInfo(...); $db->getUserInfo(...);
概要
シングルトン モードについてこれだけ説明しましたが、これには欠点がないというわけではありません。以下にシングルトン モードを使用する利点と欠点をリストします。見て、選択してください。実際の用途に応じて。
シングルトンモードの長所と短所:
長所:
システムの設計を改善する
はグローバル変数の改善です
システムリソースのオーバーヘッドを節約します
短所:
デバッグが難しい
隠れ依存エンシ
間違ったタイプのデータでシングルトンを上書きすることはできません