【概要】
クラスにインスタンスが 1 つだけあることを確認し、それにアクセスするためのグローバル アクセス ポイントを提供する [GOF95]
【特徴】
1. クラスにはインスタンスが 1 つだけあります
2. このインスタンスを独自に作成する必要があります
3. このインスタンスをシステム全体に自分で提供する必要があります
【構造図】
【主人公】
シングルトンはインスタンス操作を定義し、クライアントがその唯一のインスタンスにアクセスできるようにします。インスタンスはクラスメソッドです。唯一のインスタンスの作成を担当します。
【メリットとデメリット】
1. 固有のインスタンスへのアクセス制御
2. 名前空間を縮小します。シングルトン モードは、グローバル変数の改良版です。一意のインスタンスを格納するグローバル変数による名前空間の汚染を回避します
3. 操作とプレゼンテーションの本質を考慮して、シングルトン クラスにサブクラスを含めることができます。また、この拡張クラスのインスタンスを使用してアプリケーションを構成するのは非常に簡単です。実行時に必要なクラスのインスタンスを使用してアプリケーションを構成できます。
4. インスタンスの可変数を許可します (マルチインスタンスモード)
5.クラス運用よりも柔軟
【適用範囲】
1. クラスがインスタンスを 1 つだけ持つことができ、クライアントが既知のアクセス ポイントからアクセスできる場合
2. このインスタンスのみがサブクラス化を通じて拡張可能である必要がある場合。また、ユーザーはコードを変更せずに拡張インスタンスを使用できる必要があります。
【シングルトンモードPHPインスタンス】
$s = シングルトン::getInstance();
echo $s->info();
?>
例 #1 ファクトリ メソッドを呼び出す (パラメータ付き)
class Example
{
// パラメータ化されたファクトリ メソッド
public static function Factory($type)
{
if (include_once 'Drivers/' . $ type . '.php') {
$classname = 'Driver_' . $type;
return new $classname;
} else {
throw new Exception ('ドライバーが見つかりません');
}
}
}
?> ;
----------------------------------------
例 #2 シングルトン パターン
php
class Example
{
// この属性にクラス インスタンスを保存します
private static $instance;
// オブジェクトの直接作成を防ぐために、コンストラクターは private と宣言されます
private function __construct()
{
echo '私は構築されました ';
}
// シングルトンメソッド
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// サンプルクラスの通常のメソッド
public function bark()
{
echo 'Woof!';
}
// ユーザーがオブジェクト インスタンスをコピーしています
public function __clone()
{
trigger_error('クローンは許可されていません。', E_USER_ERROR);
}
}
?>
Java に関しては、プログラマーはシングルトン デザイン パターンと呼びますが、PHP では、この用語は異なります:
シングルトン パターン (Singleton) は、次のように使用されます。クラスに固有のオブジェクトを生成します。最も一般的に使用される場所はデータベース接続です。 シングルトン パターンを使用してオブジェクトを生成した後、そのオブジェクトは他の多くのオブジェクトで使用できます。
class Example
{
// この属性にクラスインスタンスを保存します
private static $instance;
// オブジェクトの直接作成を防ぐために、コンストラクターはプライベートとして宣言されます
private function __construct()
{
echo '私は構築されています';
}
// シングルトンメソッド
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$ instance = new $c;
}
return self::$instance;
}
// Exampleクラスの通常のメソッド
public function bark()
{
echo 'Woof!';
}
// ブロックuser オブジェクトのインスタンスをコピーします
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
}
?>
このようにして、サンプルクラス。
// コンストラクターがprivateとして宣言されているため、この書き方は間違っています
$test = new Example;
// 以下は、Exampleクラスのシングルトンオブジェクトを取得します
$test = Example ::singleton( );
$test->bark();
// オブジェクトをコピーすると E_USER_ERROR が発生します。
$test_clone = clone $test;
?>