ホームページ  >  記事  >  バックエンド開発  >  Youcai 公開授業ノート: PHP デザイン パターン (1) - シングルトン パターン

Youcai 公開授業ノート: PHP デザイン パターン (1) - シングルトン パターン

WBOY
WBOYオリジナル
2016-07-25 08:45:55865ブラウズ

最近、デザイン パターンに関する 3 つの公開クラスを実施しました。ここで、PHP におけるデザイン パターンの適用についてまとめてみましょう。これは、作成パターンのシングルトン パターンに関する最初の記事です。
1. デザインパターンの紹介
まず、デザインパターンとは何かを理解しましょう:
設計パターンは、繰り返し使用され、他の人が理解しやすく、信頼できるコード設計の経験を要約したものです。
デザインパターンは Java の特許ではありません。オブジェクト指向の手法を使用して、PHP でも 23 のデザインパターンを使用できます。
では、私たちがよく話題にするアーキテクチャ、フレームワーク、デザインパターンの間にはどのような関係があるのでしょうか?
アーキテクチャは一連のシステム構造であり、プロジェクトの全体的なソリューションです。フレームワークは再利用可能な半完成のソフトウェアであり、特定のプログラム コードです。一般にアーキテクチャには、特定の問題の解決を高速化および最適化するためにどのような種類のフレームワークを使用するかが関係しており、優れたフレームワーク コードは多くの設計パターンを合理的に使用しています。
2. デザインパターンのいくつかの原則を洗練する:
オープンクローズの原則: モジュールは拡張の場合はオープンですが、変更の場合はクローズされる必要があります。
Liskov 置換原則: 親クラスが呼び出された場合、それがサブクラスに置き換えられると、そのクラスを実行できます。
依存関係逆転の原則: 抽象化は詳細に依存せず、インターフェイス指向のプログラミングで、渡されたパラメーターは高レベルのクラスを参照しようとします。
インターフェイス分離の原則: 各インターフェイスは 1 つの役割のみを担当します。
合成/集約の再利用の原則: 合成/集約を可能な限り使用し、継承を乱用しないでください。
3. デザインパターンの機能は何ですか?
デザインパターンで解決できます
乱雑なコードを置き換えて、適切なコードスタイルを形成します
コードは読みやすく、エンジニアにとっても簡単に理解できます
新しい機能を追加する際にインターフェースを変更する必要がなく、拡張性が高いです
安定性が良く、一般的に未知の問題は発生しません
デザインパターンでは解決できません:
デザイン パターンは、直接呼び出されるライブラリではなく、コードを整理するために使用されるテンプレートです。
デザインパターンは最も効率的ではありませんが、コードの可読性と保守性の方が重要です
やみくもにデザインパターンを追求して適用するのではなく、リファクタリングの際にはそれについてもっと考えてください

4. デザインパターンの分類
1. 作成モード:
シングルトンパターン、ファクトリパターン(シンプルファクトリ、ファクトリメソッド、抽象ファクトリ)、クリエータパターン、プロトタイプパターン。
2. 構造パターン:
アダプターモード、ブリッジモード、デコレーションモード、コンビネーションモード、アピアランスモード、フライウェイトモード、プロキシモード。
3. 行動モデル:
テンプレートメソッドパターン、コマンドパターン、イテレータパターン、オブザーバパターン、メディエータパターン、メメントパターン、インタプリタパターン、状態パターン、戦略パターン、責任連鎖パターン、訪問者パターン。
5.創造的なデザインパターン
1. シングルトンモード
目的: クラスにインスタンスが 1 つだけあることを確認し、そのインスタンスにアクセスするためのグローバル アクセス ポイントを提供します。
アプリケーション シナリオ: データベース接続、キャッシュ操作、分散ストレージ。

  1. /**
  2. * Youcai.com オープンコースのサンプルコード
  3. *
  4. * シングルトンモード
  5. *
  6. * @author Youcai.com フルスタックエンジニア教育研究グループ
  7. * @see http://www.ucai.cn
  8. */
  9. class DbConn
  10. {
  11. private static $_instance = null;
  12. protected static $_counter = 0;
  13. protected $_db;
  14. //プライベート コンストラクター、外部許可なしインスタンスの作成
  15. プライベート関数 __construct()
  16. {
  17. self::$_counter += 1;
  18. }
  19. パブリック関数 getInstance()
  20. {
  21. if (self::$_instance == null)
  22. {
  23. self: : $_instance = new DbConn();
  24. }
  25. return self::$_instance;
  26. }
  27. public function connect()
  28. {
  29. echo "connected: ".(self::$_counter)."n";
  30. return $this->_db;
  31. }
  32. }
  33. /*
  34. * シングルトンモードを使用しない場合は、コンストラクターのプライベートを削除して、2 回目のコンストラクター呼び出し後、_counter が 2
  35. */ になります。
  36. // $conn = new DbConn();
  37. // $conn->connect();
  38. // $conn = new DbConn();
  39. // $conn->connect();
  40. //シングルトン モードを使用した後は、オブジェクトを直接新規作成することはできません。getInstance を呼び出して取得する必要があります
  41. $conn = DbConn::getInstance();
  42. $db = $conn->connect();
  43. //2 番目の呼び出し_counter は同じインスタンスです
  44. $conn = DbConn::getInstance();
  45. $db = $conn->connect();
コードをコピーします

特記事項: getInstance には if 判定があり、その後オブジェクトが生成されます。マルチスレッド言語では同時実行の問題が発生します。たとえば、Java ではメソッドに synchronized キーワードを追加して同期させる方法と、クラスのメンバ変数を定義するときに事前に _instac を初期化する方法がありますが、PHP ではこれら 2 つの方法をサポートしていません。ただし、PHP はマルチスレッドをサポートしていないため、この問題を考慮する必要はありません。

さらに詳しく知りたい場合は、公開授業を聞きに来てください: http://www.ucai.cn/train?f=17

オープンクラス、php


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。