ホームページ  >  記事  >  バックエンド開発  >  さまざまな PHP 設計パターンの簡単な実践例

さまざまな PHP 設計パターンの簡単な実践例

小云云
小云云オリジナル
2018-03-14 10:47:331612ブラウズ

私は、プログラマーにとって、フレームワーク、バージョン、さらには言語さえも実際には重要ではないといつも感じています。特に高度なフレームワークや新しく珍しい言語をマスターすることは、実際には問題ではありません。時間を過ごしたい、誰もがそう思います。したがって、基本的なもの、つまりアルゴリズムとデータ構造、そして優れた設計パターンが特に重要です。

シングルケースモード

シングルトンモードの特徴

  • $_instanceは静的プライベート変数として宣言する必要があります

  • コンストラクターとクローン関数はプライベートとして宣言する必要がありますこれは、外部プログラムがシングルトンを失うことを防ぐためです。例のパターンの意味

  • getInstance() メソッドは public として宣言する必要があり、一意のインスタンスへの参照を返すためにこのメソッドを呼び出す必要があります

  • ::operator は静的変数にのみアクセスできます。または静的関数

  • PHP PHP の解釈および実行メカニズムにより、各 PHP ページが解釈および実行された後にすべての関連リソースがリサイクルされるため、シングルトン モードは相対的です。

<?php
header("Content-type: text/html; charset=utf-8");
    class single{
        public static $arr=array(&#39;host&#39;=>&#39;XXX&#39;,&#39;user&#39;=>&#39;XXX&#39;,&#39;password&#39;=>&#39;XXX&#39;);
        private static $_instance =null;
        private function __construct(){}
        private function __clone(){}
        static public function getInstance(){
            if(self::$_instance== null || isset(self::$_instance)){
                self::$_instance= new self;
            }
                return self::$_instance;   
        }
        public function showSomething(){
            return self::$arr;
        }
    }
    /////////////////////test///////////////
    $a=single::getInstance();
    print_r(single::getInstance()->showSomething());
?>

ファクトリ パターン

ファクトリ クラスは、他のオブジェクトを作成するために特別に使用されるクラスです。ファクトリ クラスは、ポリモーフィック プログラミングの実践において非常に重要です。これにより、クラスの動的な置換や構成の変更が可能になり、アプリケーションがより柔軟になります。ファクトリ パターンを習得することは Web 開発にとって不可欠です。
特徴:

ファクトリ パターンは通常、インターフェイスに似たさまざまなクラスを返すために使用されます。ファクトリの一般的な用途は、多態性プロバイダーを作成することです。

通常、ファクトリ パターンにはキー構造があり、これは一般にファクトリという名前の静的メソッドです。この静的メソッドは任意の数のパラメータを受け入れることができ、オブジェクトを返す必要があります。

ファクトリ パターンはさらに次のように分類されます:

シンプル ファクトリ

ファクトリ メソッド

抽象ファクトリ
シンプル ファクトリ パターン: 同じ階層構造で任意の製品を生産するために使用されます。新しい製品の追加については何もできません

ファクトリー モード: 同じ階層構造で固定された製品を生産するために使用されます。 (任意の製品の追加をサポート)

抽象ファクトリー: さまざまな製品ファミリーのすべての製品を生産するために使用されます。 (新しい製品の追加については何もできません。製品ファミリーの追加をサポートしてください)

<?php
//简单工厂模式
header("Content-type: text/html; charset=utf-8");
class simpale{
    public function calculate($num1,$num2,$operator){
                try {
                    $result=0;
                    switch ($operator){
                        case &#39;+&#39;:
                            $result= $num1+$num2;
                            break;
                        case &#39;-&#39;:
                            $result= $num1-$num2;
                            break;
                        case &#39;*&#39;:
                            $result= $num1*$num2;
                            break;
                        case &#39;/&#39;:
                            if ($num2==0) {
                                throw new Exception("除数不能为0");
                            }
                            $result= $num1/$num2;
                            break;
                    }
                return $result;
                }
                catch (Exception $e){
                    echo "您输入有误:".$e->getMessage();
               }
            }
}
//工厂方法模式
    interface  people {
            function  jiehun();
    }
    //定义接口
    class man implements people{
        public $ring=null;
        public $car=null;
        public $house=null;
        public function getAllthing(){
            $this->ring=&#39;10000&#39;;
            $this->car=&#39;100000&#39;;
            $this->house=&#39;1000000&#39;;
        }
        public function jiehun() {
            if($this->ring && $this->car && $this->house)
                        echo &#39;我可以结婚了<br>&#39;;
                    else
                        echo &#39;我是臭屌丝,还不能结婚<br>&#39;;
        }
    }
    class women implements people {
        public $face=&#39;ugly&#39;;
        public function getAllthing(){
            $this->face=&#39;nice&#39;;
        }
          public function jiehun() {
                    if($this->face ==&#39;nice&#39;)
                        echo &#39;我可以结婚了<br>&#39;;
                    else
                        echo &#39;我是臭屌丝,还不能结婚<br>&#39;;
            }
    }
    interface  createpeople { 
        // 注意了,这里是工厂模式本质区别所在,将对象的创建抽象成一个接口。
          public function create();
    }
    class FactoryMan implements createpeople{
          public  function create() {
                    return  new man;
            }
    }
    class FactoryWomen implements createpeople {
           public function create() {
                    return new women;
            }
    }
    class  Client {
        // 简单工厂里的静态方法
            public function test() {
                $Factory =  new  FactoryMan;
                $man = $Factory->create();
                $man->jiehun();
                $Factory =  new  FactoryWomen;
                $woman = $Factory->create();
                $woman->getAllthing();
                $woman->jiehun();
            }
    }
/////////////test////////////
    $f = new Client;
    $f->test();
//抽象模式就是在工厂模式下接口中添加相应的不同方法即可
?>

戦略パターン

戦略パターンはオブジェクトの動作パターンであり、一連のアルゴリズムをカプセル化することを目的としています。必要なアルゴリズムを動的に選択して使用します。
戦略パターンとは、プログラムにおける意思決定制御に関わるパターンを指します。この設計パターン自体の核となるアイデアはオブジェクト指向プログラミングのポリモーフィックなアイデアであるため、戦略パターンは非常に強力です。
戦略パターンの 3 つの特徴:

抽象ロール クラスの定義 (実装ごとに共通の抽象メソッドを定義)

特定の戦略クラスの定義 (親クラスの共通メソッドを具体的に実装)

環境ロール クラスの定義 (プライベート化された宣言の抽象化) ロール変数、オーバーロードされたコンストラクター メソッド、抽象メソッドの実行)

<?php
abstract class baseAgent { //抽象策略类
        abstract function PrintPage();
    }
    //用于客户端是IE时调用的类(环境角色)
    class ieAgent extends baseAgent {
        function PrintPage() {
            return &#39;IE&#39;;
        }
    }
    //用于客户端不是IE时调用的类(环境角色)
    class otherAgent extends baseAgent {
        function PrintPage() {
            return &#39;not IE&#39;;
        }
    }
    class Browser {
    //具体策略角色
        public function call($object) {
            return $object->PrintPage ();
        }
    }
///////////////test////////////////
    $bro = new Browser ();
    echo $bro->call (new ieAgent );

関連する推奨事項:

PHP デザイン パターンの組み合わせパターンとケースの共有

一般的な PHP デザイン パターンの共有

PHP で一般的に使用されるデザイン パターン 概要と使用例

以上がさまざまな PHP 設計パターンの簡単な実践例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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