首頁  >  文章  >  後端開發  >  php各種設計模式的簡單實作實例

php各種設計模式的簡單實作實例

小云云
小云云原創
2018-03-14 10:47:331558瀏覽

我一直覺得什麼框架,版本,甚至語言對於一個coder來說真的不算什麼,掌握一個特別高大上的一個框架或者是一個新的,少眾的語言真的不算什麼,因為你可以,我要花時間也可以,大家都是這樣的。所以基本的顯得額外重要,就是演算法和資料結構,再就是好的設計模式了。

單例模式

單例模式特點

  • #$_instance 必須宣告為靜態的私人變數

  • 建構函式與複製函式必須宣告為私有的,這是為了防止外部程式new 類別而失去單例模式的意義

  • getInstance()方法必須宣告為公有的,必須呼叫此方法以傳回唯一實例的一個參考

  • ::運算子只能存取靜態變數或靜態函數

  • 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開發是不可或缺的。
特點:

工廠模式通常用來傳回類似介面的不同的類,工廠的一種常見用法就是創建多態的提供者。

通常工廠模式有一個關鍵的構造,即一般被命名為factory的靜態方法。這個靜態方法可以接受任意數量的參數,並且必須傳回一個物件。

工廠模式又分為:

簡單工廠模式(Simple Factory)

工廠方法模式(Factory Method)

抽象工廠模式(Abstract Factory )
簡單工廠模式:用來生產同一等級結構中的任意產品。對與增加新的產品,無能為力

工廠模式 :用來生產同一等級結構中的固定產品。 (支援增加任意產品)

抽象工廠 :用來生產不同產品族的全部產品。 (對於增加新的產品,無能為力;支持增加產品族)

<?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();
//抽象模式就是在工厂模式下接口中添加相应的不同方法即可
?>

策略模式(Strategy Pattern)

策略模式是物件的行為模式,用意是對一組演算法的封裝。動態的選擇需要的演算法並使用。
策略模式指的是程式中涉及決策控制的一種模式。策略模式功能非常強大,因為這個設計模式本身的核心思想就是物件導向程式設計的多形性想法。
策略模式的三個特性:

定義抽象角色類別(定義好各個實作的共同抽象方法)

定義具體策略類別(具體實作父類別的共同方法)

定義環境角色類別(私有化申明抽象角色變量,重載建構方法,執行抽象方法)

<?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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn