PHPにおける3つの基本設計モード


PHPのオブジェクト向けプログラミングを学んだ以上,設計パターンを学ぶことは必然である.
先日ずっと设计モードについての教程と本を见て、私の理解する设计モードは1种の思想で、プログラミングを更に筋道があって、更に聡明になって、设计モードを学ぶことを通じて自分の不足を発见して、もとはコードはこのようにすることができます!
  • ファクトリモード
  • 単例モード
  • 登録ツリーモード
  • 1.工場モデル
    工場モデルとは何か、概念だけでは理解しにくいに違いないので、コードで話します.
    <?php
    header('Content-Type:text/html;charset=utf-8');
    /* *              */
    //             +,-,*,/      
    abstruct class Operation {
        abstruct public function getValue($num1, $num2);
    }
    //        
    class OperationAdd extends Operation {
        //       getValue()  
        public function getValue($num1, $num2) {
            return $num1 + $num2;
        }
    }
    class OperationSub extends Operation {
        public function getValue($num1, $num2) {
            return $num1 - $num2;
        }
    }
    class OperationMut extends Operation {
        public function getValue($num1, $num2) {
            return $num1 * $num2;
        }
    }
    class OperationDiv extends Operation {
        public function getValue($num1, $num2) {
            try {
                if($num2 == 0) {
                    throw new Exception("      0");
                }else {
                    return $num1 / $num2;
                }
            }catch(Exception $e) {
                echo $e->getMessage();
            }
        }
    }
    //          ,                     ,           
    class Factory {
        public static function createObj($operation) {
            switch($operation) {
                case '+':
                    return new OperationAdd();
                    break;
                case '-':
                    return new OperationSub();
                    break;
                case '*':
                    return new OperationMut();
                    break;
                case '/':
                    return new OperationDiv();
                    break;
            }
        }
    }
    //           
    $testAdd = Factory::createObj('+');
    $resultAdd = $testAdd->getValue(1, 4);
    echo $resultAdd;
    ?>

    では、工場類を使うメリットは何でしょうか.まず、拡張性が大幅に向上しました.もし私が余剰を取る操作を追加したいなら、余剰を取るアルゴリズムクラスを1つ追加し、工場モードで他の部分を動かすことなく判断を追加する必要があります.次に、メンテナンスが容易で、もしこれが給与システムであれば、プログラマーに税金控除操作を追加させたいのですが、このモードを使用しなければ、私はすべてのコードを彼に渡す必要があります.加算操作に判断を加えるだけで、if(name=’zjp’)は100元(少なめにして、さもないと捕まえられるべきだ、冗談だ).もし私が工場モードを使ったら、彼は1つのクラスを増やすだけでいいし、大量のコードを読む必要もなく、より多くの判断を増やす必要もありません.
    2.単例モード
    シングル・インスタンス・モードは、データベース接続など、1つのオブジェクトのみを生成し、重複しない本番オブジェクトです.多くの接続を生産すると、リソースがかかります.この場合、シングル・インスタンス・モードを使用する必要があります.やはりコードで話します.
    <?php
    
    class Single {
    /* *            *   ,          static  ,     static   */
    public static $single;
    //           ,          
    private function __construct() {
    }
    //            
    public static function getInstance() {
        //                      ,       。instanceof                   
        if(self::$single instanceof self) {
            return self::$single;
        }
        self::$single = new self();
        return self::$single;
    }
    }
    ?>

    3.登録ツリーモード
    登録ツリーモードは、オブジェクトを生成するときに、このオブジェクトを私のツリーに挿入し、このオブジェクトが必要になったら直接ツリーから抜くといいです.ここで私たちのツリーは実は2次元配列で、key値は私たちがツリーに挿入したマークで、valueはオブジェクトです.コード:
    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]);
        }
    
    }

    では、この3つのパターンはどのように結合されているのでしょうか.
    実は簡単です.私たちがしなければならないのは、工場クラスを使用して単一のモデルのオブジェクトを生産し、木に挿入することです.
    //   
    class Factory {
        public static function toNew() {
            return Single::getInstance();
        }
    }
    //                   
    //      $zjp 
    Register::set('zjp', Factory::toNew());
    //    
    $zjp = Register::get('zjp');
    print_r($zjp);
    //  ,         $zjp,        Single