首頁  >  文章  >  後端開發  >  PHP設計模式(二)

PHP設計模式(二)

WBOY
WBOY原創
2016-08-08 09:33:08856瀏覽

  從最近開始我給自己定了個目標,每周至少更新2篇博客,用來記錄自己在上一周裡面遇到的問題或者想出的新點子,一方面對自己掌握的知識進行記錄,免得時間久了忘得一乾二淨,二來我的博文雖然不太好但也許會對一小部分讀者產生一定的影響,而且我相信隨著我原創博文寫的次數越來越多,肯定水平會越來越高,深度也會越來越深(哈哈,我也很羨慕那些出名的博主,不但專業知識很棒,而且文筆也棒的很)。一週兩篇我發現完全記錄不完我想記錄的東西,就像這週,我還有日誌系統、二進位資料快取(其實叫low一點的資料庫比較合適)、QQwry.dat資料解讀、zip壓縮檔增量生成這幾個方面的都沒有進寫,在以後的時間裡我會慢慢更新到我的博客的,好了不扯了,這次我來介紹另外一種模式。

  • 簡單工廠模式

  其實這種模式也是比較常用的,應該先介紹,​​但由於我接觸的單例模式比較多,所以就先介紹單例模式了。簡單工廠模式,首先看下對它的定義:從設計模式的類型上來說,簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠物件決定創建哪一種產品類別的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。

  簡單工廠模式在專案中有什麼好處呢?他有兩個好處:

1. 首先就是使用簡單工廠模式可以根據不同的參數去實例化不同的類,而不是new方法去實例化每一個不同的類,這樣給使用者這樣更好管理。

2. 其次是如果要實例化的類別在多個檔案中用到,當我們修改類別名稱的時候只需要去修改工廠類別就行,而不必修改每一個實例化該類別的檔案(有點雞肋的感覺,這種情況很少見)。

  看一個最經典也最好理解的一個簡單工廠模式的例子,運算符操作:

  簡單工廠模式的工廠類別一般是使用靜態方法,透過接受不同的參數來返回不同的物件實例,程式碼是寫死的,因此不修改程式碼就不能進行擴展,違反了OCP(對擴展開發,對修改關閉原則)。

<?<span>php
</span><span>/*</span><span>*
 * 简单工厂模式&mdash;&mdash;经典运算符例子
 * @author 燕睿涛(luluyrt@163.com)
 </span><span>*/</span>
<span>/*简单</span><span>工********************厂********************类</span><span>*/</span>
<span>class</span><span> Operation{
    </span><span>/*</span><span>*
     * @var int $numa
     * 要操作的两个数字
     </span><span>*/</span>
    <span>protected</span> <span>$numa</span><span>;
    </span><span>protected</span> <span>$numb</span><span>;
    </span><span>public</span> <span>function</span> __construct(<span>$a</span>,<span>$b</span><span>){
        </span><span>$this</span>->numa = <span>$a</span><span>;
        </span><span>$this</span>->numb = <span>$b</span><span>;
    }

    </span><span>//</span><span>静态方法,通过接受不同的参数生成不同的对象实例</span>
    <span>public</span> <span>static</span> <span>function</span> create(<span>$operation</span>,<span>$a</span>,<span>$b</span><span>){
        </span><span>switch</span> (<span>$operation</span><span>) {
            </span><span>case</span> '+':
                <span>return</span> <span>new</span> Operationadd(<span>$a</span>,<span>$b</span><span>);
                </span><span>break</span><span>;
            
            </span><span>case</span> '-':
                <span>return</span> <span>new</span> Operationminus(<span>$a</span>,<span>$b</span><span>);
                </span><span>break</span><span>;
            </span><span>default</span>:
                <span>#</span><span> code...</span>
                <span>break</span><span>;
        }
    }

}
</span><span>/*</span><span>**********************************************</span><span>*/</span>

<span>/*</span><span>加法</span><span>*/</span>
<span>class</span> Operationadd <span>extends</span><span> Operation{
    </span><span>public</span> <span>function</span><span> doing(){
        </span><span>return</span> <span>$this</span>->numa + <span>$this</span>-><span>numb;
    }
}

</span><span>/*</span><span>减法</span><span>*/</span>
<span>class</span> Operationminus <span>extends</span><span> Operation{
    </span><span>public</span> <span>function</span><span> doing(){
        </span><span>return</span> <span>$this</span>->numa - <span>$this</span>-><span>numb;
    }
}

</span><span>$test</span> = Operation::create('+',2,56<span>);
</span><span>echo</span> <span>$test</span>->doing();
  • 工廠模式

  之前我在專案中只接觸到了簡單工廠模式,為了寫這篇文章我特意查了資料,發現工廠模式有三種:簡單工廠模式(又叫靜態工廠模式)、工廠模式、抽象工廠模式,看了工廠模式之後感覺他的用處好像不是很大,只是符合了OCP原則,在有新的符合抽象產品接口和抽象工廠接口的產品時我們只需要去擴展一種具體的產品和工廠就行,而不必去修改原有程式碼,總結下工廠模式的優缺點:

優點:首先就是符合了OCP原則,擴展性提高了;其次就是可維護性提高了,在修改一個具體工廠角色時只要找到自己的工廠角色就行,不用擔心影響到其他工廠角色的實現。

缺點:程式碼多了,每種產品都要一個產品類別和一個工廠類別。這個缺點可以用簡單工廠模式和工廠模式的結合來實現,將類似的產品類別的工廠類別合併為一個。

<?<span>php
</span><span>/*</span><span>*
 * 简单工厂模式&mdash;&mdash;经典运算符例子
 * @author 燕睿涛(luluyrt@163.com)
 </span><span>*/</span>
<span>/*</span><span>工*********厂**********方**********法</span><span>*/</span>
<span>//</span><span>交通工具接口(抽象产品角色)</span>
<span>interface</span><span> vehicle{
    </span><span>public</span> <span>function</span><span> runing();
}
</span><span>//</span><span>交通工具工厂接口(抽象工厂角色)</span>
<span>interface</span><span> vehiclefactory{
    </span><span>public</span> <span>static</span> <span>function</span><span> get();
}
</span><span>/*</span><span>具体产品角色</span><span>*/</span>
<span>class</span> car <span>implements</span><span> vehicle{
    </span><span>public</span> <span>function</span><span> runing(){
        </span><span>echo</span> "My speed is 120KM/h \r"<span>;
    }
}

</span><span>class</span> bicycle <span>implements</span><span> vehicle{
    </span><span>public</span> <span>function</span><span> runing(){
        </span><span>echo</span> "My speed is 30KM/h \r"<span>;
    }
}
</span><span>/*</span><span>具体工厂角色</span><span>*/</span>
<span>class</span> carfactory <span>implements</span><span> vehiclefactory{
    </span><span>public</span> <span>static</span> <span>function</span><span> get(){
        </span><span>return</span> <span>new</span><span> car();
    }
}
</span><span>class</span> bicyclefactory <span>implements</span><span> vehiclefactory{
    </span><span>public</span> <span>static</span> <span>function</span><span> get(){
        </span><span>return</span> <span>new</span><span> bicycle();
    }
}

</span><span>$test</span> = bicyclefactory::<span>get();
</span><span>$test</span>->runing();

工廠類自己沒在具體項目中用過,說起來總感覺有點怪怪的感覺,要是有什麼不對的、不恰當的地方,還望各位高手前輩們指出。

send Me~

以上就介紹了PHP設計模式(二),包括了方面的內容,希望對PHP教程有興趣的朋友有幫助。

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