三。工廠模式和單例模式

2021-06-28 12:40:55 字數 1723 閱讀 4139

設計模式

概念:所謂設計模式,就是一些解決問題的「常規做法」,是一種認為較好的經驗總結。面對不同的問題,可能會有不同的解決辦法,此時就可以稱為不同的設計模式。

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 雙重檢驗 這是最優的執行緒安全 即使用於單執行緒又適用於多執行緒 第乙個進來的時候,判斷為空,然後加鎖,繼續判斷為空,如果開闢了空間之後,還沒有去賦值,這時候有其他執...