この記事では、PHP に関する関連知識を提供します。主に、シングルトン モード、ファクトリー モード、登録ツリー モード、戦略を含む 6 つの主要な設計パターンに関する関連問題を紹介します。の内容を見てみましょう。モード、アダプターモード、オブザーバーモード. 皆様のお役に立てれば幸いです。
推奨学習: 「PHP ビデオ チュートリアル 」
プライベート 3 つとパブリック 1 つ: プライベート静的変数 (インスタンスを保存するため)、プライベート コンストラクター (インスタンスの作成を防ぐため)、プライベート クローン作成メソッド (オブジェクトのクローン作成を防ぐため) ) 、パブリック静的メソッド (インスタンスを外部に提供する)
プログラム アプリケーションで、データベース操作が関与する場合、データベースに接続する場合を操作するたびに、大量のリソースが消費されます。シングルトン モードを使用して、一意のデータベース接続オブジェクトを作成できます。
<?phpclass Singleton{ private static $_instance; private function __construct(){} private function __clone(){} public static function getInstance() { if(self::$_instance instanceof Singleton){//instanceof 判断一个实例是否是某个类的对象 self::$_instance = new Singleton(); } return self::$_instance; }}
呼び出し元のオブジェクトを作成されたオブジェクトから分離し、呼び出し元は、コードの結合を減らし、システムの保守性と拡張性を向上させます。
オブジェクトを作成する特定のメソッドをクラスに提供すると、new を直接使用する代わりにファクトリ クラスを使用してオブジェクトを作成できるようになります。この方法では、作成されるオブジェクトのタイプを変更する場合、ファクトリを変更するだけで済みます。
//假设3个待实例化的类class Aclass{}class Bclass{}class Cclass{}class Factory{ //定义每个类的类名 const ACLASS = 'Aclass'; const BCLASS = 'Bclass'; const CCLASS = 'Cclass'; public static function getInstance($newclass) { $class = $newclass;//真实项目中这里常常是用来解析路由,加载文件。 return new $class; }}//调用方法:Factory::getInstance(Factory::ACLASS);
登録ツリー モードでは、オブジェクト インスタンスをグローバル オブジェクト ツリーに登録します。必要に応じてオブジェクト ツリーから選択します。
シングルトン モード、ファクトリ モード、またはその 2 つの組み合わせのいずれでオブジェクトを生成しても、それらはすべて「挿入」されます。登録してください。木の上で。オブジェクトを使用するときは、登録ツリーから直接オブジェクトをフェッチするだけです。これは、グローバル変数を使用するのと同じくらい便利で実用的です。また、登録ツリー パターンは、他のパターンにも非常に良いアイデアを提供します。 (次の例は、シングルトン、ファクトリー、および登録ツリーを組み合わせて使用するものです)
//创建单例class Single{ public $hash; static protected $ins=null; final protected function __construct(){ $this->hash=rand(1,9999); } static public function getInstance(){ if (self::$ins instanceof self) { return self::$ins; } self::$ins=new self(); return self::$ins; }}//工厂模式class RandFactory{ public static function factory(){ return Single::getInstance(); }}//注册树class Register{ protected static $objects; public static function set($alias,$object){ self::$objects[$alias]=$object; } public static function get($alias){ return self::$objects[$alias]; } public static function _unset($alias){ unset(self::$objects[$alias]); }}//调用Register::set('rand',RandFactory::factory());$object=Register::get('rand');print_r($object);
一連のアルゴリズムを使用して、各アルゴリズムをカプセル化して交換可能にします。 Strategy パターンを使用すると、アルゴリズムを使用するクライアントとは独立してアルゴリズムを変更できます。
戦略パターンは、関連するアルゴリズム ファミリを管理する方法を提供します。戦略パターンは、継承関係を置き換える方法を提供します。戦略パターンを使用すると、次のような問題を回避できます。複数の条件付き転送ステートメントを使用します。
複数のクラスは動作が異なるだけであり、ストラテジー モードを使用して、実行時に実行する特定の動作を動的に選択できます。たとえば、学校に行くには、徒歩、バス、地下鉄など、さまざまな方法があります。
abstract class Strategy{ abstract function goSchool();}class Run extends Strategy{ public function goSchool() { // TODO: Implement goSchool() method. }}class Subway extends Strategy{ public function goSchool() { // TODO: Implement goSchool() method. }}class Bike extends Strategy{ public function goSchool() { // TODO: Implement goSchool() method. }}class Context{ protected $_stratege;//存储传过来的策略对象 public function goSchoole() { $this->_stratege->goSchoole(); }}//调用:$contenx = new Context();$avil_stratery = new Subway();$contenx->goSchoole($avil_stratery);
組み合わせまったく異なるさまざまな機能 インターフェースは統一された API にカプセル化されています。
PHP には、MySQL、MySQLi、PDO の 3 つのデータベース操作があります。アダプター モードを使用すると、異なるデータベース操作を 1 つに統合できます。 API。同様のシナリオには、memcache、redis、file、apc などのさまざまなキャッシュ機能を一貫したものに統合できるキャッシュ アダプターが含まれます。
abstract class Toy{ public abstract function openMouth(); public abstract function closeMouth();}class Dog extends Toy{ public function openMouth() { echo "Dog open Mouth\n"; } public function closeMouth() { echo "Dog close Mouth\n"; }}class Cat extends Toy{ public function openMouth() { echo "Cat open Mouth\n"; } public function closeMouth() { echo "Cat close Mouth\n"; }}//目标角色(红)interface RedTarget{ public function doMouthOpen(); public function doMouthClose();}//目标角色(绿)interface GreenTarget{ public function operateMouth($type = 0);}//类适配器角色(红)class RedAdapter implements RedTarget{ private $adaptee; function __construct(Toy $adaptee) { $this->adaptee = $adaptee; } //委派调用Adaptee的sampleMethod1方法 public function doMouthOpen() { $this->adaptee->openMouth(); } public function doMouthClose() { $this->adaptee->closeMouth(); }}//类适配器角色(绿)class GreenAdapter implements GreenTarget{ private $adaptee; function __construct(Toy $adaptee) { $this->adaptee = $adaptee; } //委派调用Adaptee:GreenTarget的operateMouth方法 public function operateMouth($type = 0) { if ($type) { $this->adaptee->openMouth(); } else { $this->adaptee->closeMouth(); } }}class testDriver{ public function run() { //实例化一只狗玩具 $adaptee_dog = new Dog(); echo "给狗套上红枣适配器\n"; $adapter_red = new RedAdapter($adaptee_dog); //张嘴 $adapter_red->doMouthOpen(); //闭嘴 $adapter_red->doMouthClose(); echo "给狗套上绿枣适配器\n"; $adapter_green = new GreenAdapter($adaptee_dog); //张嘴 $adapter_green->operateMouth(1); //闭嘴 $adapter_green->operateMouth(0); }}//调用$test = new testDriver();$test->run();
オブザーバー パターン (Observer)、オブジェクトの状態が変化すると、すべてのこれに依存するオブジェクトは自動的に通知され、更新されます。オブザーバー パターンは、結合度が低く、非侵入的な通知および更新メカニズムを実装します。
イベントの発生後、一連の更新操作を実行する必要があります。従来のプログラミング方法は、イベント コードの直後に処理ロジックを追加することです。更新されるロジックが増えると、コードの保守が困難になります。このメソッドは結合されており侵入的であるため、新しいロジックを追加するにはイベントのメイン コードを変更する必要があります。
// 主题接口interface Subject{ public function register(Observer $observer); public function notify();}// 观察者接口interface Observer{ public function watch();}// 主题class Action implements Subject{ public $_observers=[]; public function register(Observer $observer){ $this->_observers[]=$observer; } public function notify(){ foreach ($this->_observers as $observer) { $observer->watch(); } }}// 观察者class Cat1 implements Observer{ public function watch(){ echo "Cat1 watches TV<hr/>"; }} class Dog1 implements Observer{ public function watch(){ echo "Dog1 watches TV<hr/>"; } } class People implements Observer{ public function watch(){ echo "People watches TV<hr/>"; } }// 调用实例$action=new Action();$action->register(new Cat1());$action->register(new People());$action->register(new Dog1());$action->notify();
推奨学習: 「PHP ビデオ チュートリアル 」
以上がPHP でよく使用される 6 つの設計パターン (概要の共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。