因爲本人才疏學淺,對問題認知不免有誤差,本着學習與共享的精神和你們一塊兒探討,如有不對之處,望你們多多批評指正。
1、什麼是設計模式?web
設計模式就是一個教你如何利用真實可靠的設計來組織你的代碼的模板,是解決特定問題的有效方法。通俗點說就是設計方法。在軟件設計中,不可避免地要碰到一些設計上的問題,這些問題前人已經遇到過,而且總結出一些解決相關問題的方法,稱這一系列方法爲「模式」。
2、設計模式的原則
1.開-閉原則:
就是說模塊應對擴展開放,而對修改關閉。簡單點說就是模塊應儘可能在不修改原(是"原",指原來的代碼)代碼的狀況下進行擴展。(個人理解就是擴展性要好,也就是OOP的可擴展)
2.里氏代換原則
若是調用的是父類的話,那麼換成子類也徹底能夠運行。(個人理解就是子類重寫父類的方法的訪問權限要大於父類的訪問權限,我以爲這個原則強調的是OOP的繼承和重寫)
3.合成複用原則
就是說要少用繼承,多用合成關係來實現。(個人理解是針對接口編程)
4.依賴倒轉原則
抽象不該該依賴於細節,細節應當依賴於抽象。
要針對接口編程,而不是針對實現編程。
傳遞參數,或者在組合聚合關係中,儘可能引用層次高的類。
5.接口隔離原則
每個接口應該是一種角色,很少很多,不幹不應乾的事,該乾的事都要幹。(個人理解是分工明確)
6.抽象類
7.迪米特法則
最少知識原則。不要和陌生人說話。
3、全部的設計模式都有一些經常使用的特性:模式名稱,問題,解決方案,效果。
A:模式名稱(pattern name):
一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。
B:問題(problem)
描述了應該在什麼時候使用模式。它解釋了設計問題和問題存在的來龍去脈,它可能描述了特定的設計問題,如怎樣用對象表示算法等。也可能描述了致使不靈活設計的類或對象結構。有時候,問題部分會包括使用模式必須知足的一系列先決條件。
C:解決方案(solution)
描述了設計的組成成分,它們之間的相互關係及各自的職責和協做方式。由於模式就像一個模板,可應用於多種不一樣場合,因此解決方案並不描述一個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用一個具備通常意義的元素組合(類或對象組合)來解決這個問題。
D:效果(consequences)
描述了模式應用的效果及使用模式應權衡的問題。儘管咱們描述設計決策時,並不總提到模式效果,但它們對於評價設計選擇和理解使用模式的代價及好處具備重要意義。軟件效果大多關注對時間和空間的衡量,它們也表述了語言和實現問題。由於複用是面向對象設計的要素之一,因此模式效果包括它對系統的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式頗有幫助。
4、使用設計模式的優勢:可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
5、PHP經常使用的設計模式
工廠模式:工廠模式 是一種類,它具備爲您建立對象的某些方法。您可使用工廠類建立對象,而不直接使用 new
。
實例:
- <?php
- 簡單工廠模式
- /**
- * 定義運算類
- *
- */
- abstract class Operation {
- //存儲第一個數字
- protected $_NumberA = 0;
- //存儲第二個數字
- protected $_NumberB = 0;
- //存儲運算結果
- protected $_Result = 0;
- public function __construct(){}
- /**
- * 設定須要運行的二個數字
- * @param 第一個數字 $A
- * @param 第二個數字 $B
- */
- public function SetNumber($A=0,$B=0) {
- $this->_NumberA = $A;
- $this->_NumberB = $B;
- }
- /**
- * 清除全部數據
- *
- */
- protected function ClearResult(){
- $this->_Result = 0;
- }
- abstract function GetResult($type) {}
- }
- /**
- * 數據相加
- */
- class OperactionAdd extends Operation {
- public function GetResult(){
- $this->_Result = $this->_NumberA + $this->_NumberB;
- return $this->_Result;
- }
- }
- /**
- * 數據相減
- */
- class OperactionSub extends Operation {
- public function GetResult(){
- $this->_Result = $this->_NumberA - $this->_NumberB;
- return $this->_Result;
- }
- }
- /**
- * 數據相乘
- */
- class OperactionMul extends Operation {
- public function GetResult(){
- $this->_Result = $this->_NumberA * $this->_NumberB;
- return $this->_Result;
- }
- }
- /**
- * 數據相除
- */
- class OperactionDiv extends Operation {
- public function GetResult(){
- $this->_Result = $this->_NumberA / $this->_NumberB;
- return $this->_Result;
- }
- }
- class OperactionFactory{
- private static $_Obj;
- public static function CreateOperaction($type) {
- switch($type) {
- case "+":
- self::$_Obj = new OperactionAdd;
- break;
- case "-":
- self::$_Obj = new OperactionSub;
- break;
- case "*":
- self::$_Obj = new OperactionMul;
- break;
- case "/":
- self::$_Obj = new OperactionDiv;
- break;
- }
- return self::$_Obj;
- }
- }
- $Obj = OperactionFactory::CreateOperaction("*");
- $Obj->SetNumber(6,4);
- $num = $Obj->GetResult();
- var_dump($num);
- ?>
單例模式:某些應用程序資源是獨佔的,由於有且只有一個此類型的資源。例如,經過數據庫句柄到數據庫的鏈接是獨佔的。
單例模式的核心思想是:保證一個對象存在且僅容許存在一個實例,並提供一個全局訪問方式。單例模式的運做模型是:當對象第一次被請求時,建立這個對象的實例;以後的每次請求,僅傳遞已建立實例的句柄。在WEB程序中應用單例模式的一個典型例子是數據庫鏈接的建立:經過數據庫句柄來鏈接數據庫這一行爲是獨佔的。換言之,在一個句柄還沒有關閉以前,你沒法第二次建立一個相同名稱的句柄。在此場景下,咱們能夠運用單例模式來維護和共享同一個數據庫句柄。優勢有二:
1、提升了程序運行上的安全性。你沒必要過多的擔憂和考慮諸如數據庫打開/關閉的問題。
2、避免了因建立多個鏈接致使的沒必要要資源浪費。垃圾回收機制僅須要對一個連接句柄進行操做。
固然,以上兩個問題對於PHP來講並非問題,PHP的垃圾回收機制就是:當一個頁面執行完畢會自動清空全部資源和內存,這裏面就包括數據庫鏈接。
至此,能夠總結出單例模式在WEB程序中的運用場合:
1、某些資源自己具備獨佔性,你不但願在多個地方重複建立對這個獨佔資源對象的實例。
2、你須要在同一個對象的實例的多個引用之間共享這個對象的狀態。
- 實例:
- <?php
- class Single {
- //此成員變量用來記錄此對象的引用次數
- private $counter = 1;
- //注意這裏是private,即禁止外部程序經過解析函數實例化對象
- private function __construct() {}
- //禁止克隆這個對象
- private function __clone() {}
- //必須經過此方法獲得對象的引用
- public static function getInstance() {
- static $instance = null;
- if($instance == null) {
- $instance = new Singleton();
- }
- return $instance;
- }
- public function getUsedCount() {
- return $this->counter++;
- }
- }
- //測試代碼
- echo Single::getInstance()->getUsedCount(); //echo 1
- echo Single::getInstance()->getUsedCount(); //echo 2
- echo Single::getInstance()->getUsedCount(); //echo 3
- $obj = new Single(); //這樣會報語法錯誤
- ?>
從以上代碼中,咱們總結出PHP單例模式實現的核心要點有以下三條:
1. 須要一個保存類的惟一實例的靜態成員變量(一般爲$_instance私有變量)
2. 構造函數和克隆函數必須聲明爲私有的,這是爲了防止外部程序new類從而失去單例模式的意義
3. 必須提供一個訪問這個實例的公共的靜態方法(一般爲getInstance方法),從而返回惟一實例的一 個引用