前の記事「PHP のテンプレート メソッド パターンの詳細分析」では、PHP のテンプレート メソッド パターンについて紹介しました。次の記事では、PHP デザイン パターンのシングルトンについて説明します。 。 モデル。
#シングルトン パターンは、一般的に使用され、頻繁に質問されるインタビュー デザイン パターンの中で間違いなく 1 位にランクされます。一方で、それは非常にシンプルであり、いくつかの言葉で説明できます。一方で、非常に複雑であり、その実装は 1 つの形式だけでなく、Java などの非同期言語におけるマルチスレッド ロックの問題も考慮する必要があります。したがって、面接中、面接官がシングルトン モデルについて質問するときにリラックスするとは思わないでください。このモデルは実際には深いことも浅いこともあり、開発者のレベルを非常に反映する可能性があります。一定期間仕事をしていると必ずこのモデルに触れる事になるからです。
GoF 定義: クラスにはインスタンスが 1 つだけあることを確認し、それにアクセスするためのグローバル アクセス ポイントを提供します。
#GoF クラス図
##コード実装class Singleton
{
private static $uniqueInstance;
private $singletonData = '单例类内部数据';
private function __construct()
{
// 构造方法私有化,外部不能直接实例化这个类
}
public static function GetInstance()
{
if (self::$uniqueInstance == null) {
self::$uniqueInstance = new Singleton();
}
return self::$uniqueInstance;
}
public function SingletonOperation(){
$this->singletonData = '修改单例类内部数据';
}
public function GetSigletonData()
{
return $this->singletonData;
}
}
$singletonA = Singleton::GetInstance(); echo $singletonA->GetSigletonData(), PHP_EOL; $singletonB = Singleton::GetInstance(); if ($singletonA === $singletonB) { echo '相同的对象', PHP_EOL; } $singletonA->SingletonOperation(); // 这里修改的是A echo $singletonB->GetSigletonData(), PHP_EOL;
クライアントによって呼び出されると、
singletonB がまったく同じオブジェクトであることがわかります。 はい、コードからわかるように、シングルトンの最大の用途は、オブジェクトをグローバルに一意にすることです。完全なコード: https: //github.com/zhangyue0503/designpatterns-php/blob/master/21.singleton/source/singleton.php
Example
説明<?php class HttpService{ private static $instance; public function GetInstance(){ if(self::$instance == NULL){ self::$instance = new HttpService(); } return self::$instance; } public function Post(){ echo '发送Post请求', PHP_EOL; } public function Get(){ echo '发送Get请求', PHP_EOL; } } $httpA = new HttpService(); $httpA->Post(); $httpA->Get(); $httpB = new HttpService(); $httpB->Post(); $httpB->Get(); var_dump($httpA == $httpB);ログイン後にコピー
- まだ非常に単純ですか?ここでは、この形式のシングルトンについてはこれ以上説明しません。他のいくつかの形式のシングルトンについて話しましょう
- 私たちのコードと例は明らかにハングリーマンスタイルではなく、この形式は怠け者スタイルと呼ばれます。 GetInstance() を積極的に使用して取得する必要があります。その後、オブジェクトを作成します。
Java などの静的言語の場合宣言
#instance = new HttpService(); では、静的変数を直接新しいオブジェクトにすることができます。このように、GetInstance() メソッドは省略できますが、この静的変数は使用されるかどうかに関係なく直接インスタンス化され、メモリを占有します。この種のシングルトンは、Hungry Chinese シングルトン パターンと呼ばれます。- Lazy スタイル Java マルチスレッドや PHP で swoole を使用した後などのマルチスレッド アプリケーションでは、繰り返し作成される問題が発生し、複数回作成されたオブジェクトは同じオブジェクトではありません。現時点では、グローバル オブジェクトが 1 つだけ存在することを確認するために、通常は二重検出が使用されます。特定のコードは自分で見つけることができます。 Hungry Han スタイル自体はすでに static 属性に値が割り当てられているため、再度変更されることはありません。
- もう 1 つの方法は、静的内部クラスを作成することです。これはめったに見られず、リソース使用率が高くなります。静的変数をメソッド内に配置すると、静的変数はクラス内の変数ではなくメソッド内の変数になります。これにより、シングルトン オブジェクトが独自の静的メソッドとプロパティを呼び出すことができます。
元のアドレス: https://juejin.cn/post/6844903990585458702著者: ハードコア プロジェクト マネージャー推奨学習: "PHP ビデオ チュートリアル "
以上がPHP のシングルトン パターンについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。