設計模式
概念:所謂設計模式,就是一些解決問題的「常規做法」,是一種認為較好的經驗總結。面對不同的問題,可能會有不同的解決辦法,此時就可以稱為不同的設計模式。
1、工廠模式
在實際應用中,我們總是需要去例項化很多很多的類——以得到物件。
則:我們可以設計出乙個「工廠」(其實就是類),該工廠的作用(任務)就是為人們「生產」各種物件。這種工廠通常只要指定類名,就可以據此獲取乙個該類的物件。
舉例:<?php
class factoryelse}}
$obj1 = factory::getinstance("a"); //獲取類a的乙個物件
$obj2 = factory::getinstance("b");//獲取類b的乙個物件
$obj3 = factory::getinstance("a");//再獲取類a 的乙個物件
?>
2、單例模式
應用中的某種需求:
對於某些類,在使用它的時候,從頭到尾(程式執行的開始到結束),都只需要乙個物件,就可以完成所有任務。
單例:某個類,只允許其「建立」出乙個物件,即使去進行多次建立,也只能得到乙個物件。
$obj1 = new a();
$obj2 = $obj1; //此時還是1個物件,$obj2只是最終指向了跟$obj1同樣的物件
$obj3 = new a(); //這時候才有了第二個物件。
但其實在php語言中,乙個物件還可以使用clone運算子進行轉殖,則就也會「生成」新物件。
因此,還需要在類中使用私有化措施來禁止轉殖,最終
單例模式的核心**實現如下:
<?php
class b
return b::$instance; //b::$instance獲取當前屬性的值
}private function __construct( ) //定義了乙個私有的建構函式,防止在外部new物件
private function __clone( ) //使用魔術方法,禁止在外部用clone運算子禁止轉殖
}$v1=b::getnew(); //呼叫方法建立物件,實現單例模式
?>
詳細的理解單例模式:
用乙個構造方法,是為了禁止new;
例項化乙個屬性,是為了禁止賦值物件;
建立乙個私有的魔術方法,是為了防止用clone運算子轉殖物件。
(1)、為了實現單例模式,定義了乙個私有的建構函式,此時類外不能建立物件呼叫類中的方法,若需要建立乙個物件,則需要在方法中用return new self;獲取乙個物件,此時方法需要用靜態的方法,類外建立物件的形式為:$物件名=類名::方法名();
(2)、此時建立多物件還是會有不同的物件,此時需要在類中例項化乙個私有的靜態屬性,在方法中用isset(類名::$屬性名)函式判斷靜態屬性是否賦值,若沒有賦值,用靜態屬性儲存物件new self;
(3)若在前兩步完成的條件下,轉殖乙個建立的物件 $物件1=clone $物件2; 則會發現轉殖出來的物件是乙個新的標示符,此時發現單例模式並不完整,所以要在類中禁止轉殖的發生,用魔術方法 private function __clone()禁止轉殖,魔術方法中沒有語句,發生原理:clone運算子在轉殖物件的時候,會先去呼叫__clone()魔術方法,此時把魔術方法設定成私有的,則轉殖時呼叫不到此方法,禁止轉殖
單例模式和工廠模式
實現思路 將構造方法私有化 宣告本類型別的靜態私有屬性 提供共有靜態方法獲取 本類物件 class static x new public static get class static x null public static get 優點 缺點 產品介面 public inte ce produ...
單例模式 工廠模式
單例模式 一 什麼是單例模式 有時候我們會遇到這樣一種情況,乙個類只能有乙個物件被例項化,這時我們就可以使用單例模式了。單例模式通過類本身來管理其唯一例項。在設計這個類的時候,讓他只能建立乙個例項並提供對此例項的全域性訪問。因此單例模式有兩個最基本的條件是,確保乙個類只有乙個例項被建立,提供乙個對例...
工廠模式 單例模式
一.單例模式介紹 單例類只能有乙個例項。單例類必須自己建立自己的唯一例項。單例類必須給所有其他物件提供這一例項。二.單例模式分為 4 雙重檢驗 這是最優的執行緒安全 即使用於單執行緒又適用於多執行緒 第乙個進來的時候,判斷為空,然後加鎖,繼續判斷為空,如果開闢了空間之後,還沒有去賦值,這時候有其他執...