設計模式一(php示例 單例模式和工廠模式)

2021-09-02 07:01:31 字數 1917 閱讀 4661

所謂的設計模式,就是具有多年開發經驗的人,在實際工作中為了解決某一種需求,而形成的一套**方案。

1.單例模式:

單例模式:所謂的單例模式就是單一的例項。通過乙個類永遠只能獲取乙個物件。

基本的實現思路:單例模式要求類能夠有返回物件乙個引用(永遠是同乙個)和乙個獲得該例項的方法(必須是靜態方法,通常使用getinstance這個名稱)。

單例的實現主要是通過以下兩個步驟:

將該類的構造方法定義為私有方法,這樣其他處的**就無法通過呼叫該類的構造方法來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項;

在該類內提供乙個靜態方法,當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用。

**如下:

優點:系統記憶體中該類只存在乙個物件,節省了系統資源,對於一些需要頻繁建立銷毀的物件,使用單例模式可以提高系統效能。

缺點:當想例項化乙個單例類的時候,必須要記住使用相應的獲取物件的方法,而不是使用new,可能會給其他開發人員造成困擾,特別是看不到原始碼的時候。

適用場合:

2.工廠模式:所謂工廠模式就是乙個類(factory)負責為其他的類例項化物件。

所謂工廠模式還真和生產有關。通過乙個工廠類生產。怎麼生產呢?工廠類呼叫自身靜態方法來生產物件例項。

工廠模式有乙個關鍵的構造,根據一般原則命名為factory的靜態方法,然而這只是一種原則,雖然工廠方法可以任意命名這個靜態還可以接受任意資料的引數,必須返回乙個物件。

為什麼要用工廠模式?

很多沒接觸過工廠模式的人會不禁問,為啥我要費那麼大的勁兒去構造工廠類去建立物件呢?不去套用那些易維護,可擴充套件之類的話,我們可以考慮這樣乙個簡單的問題。如果專案中,我們通過乙個類建立物件。在快完成或者已經完成,要擴充套件功能的時候,發現原來的類類名不是很合適或者發現類需要新增構造函式引數才能實現功能擴充套件。我靠!我都通過這個類建立了一大堆物件例項了啊,難道我還要乙個乙個去改不成?我們現在才感受到了「高內聚低耦合」的博大精深。沒問題,工廠方法可以解決這個問題。

再考慮一下,我要連線資料庫,在php裡面就有好幾種方法,mysql擴充套件,mysqli擴充套件,pdo擴充套件。我就是想要乙個物件用來以後的操作,具體要哪個,視情況而定嘍。既然你們都是連線資料庫的操作,你們就應該擁有相同的功能,建立連線,查詢,斷開連線...(此處顯示介面的重要性)。總而言之,這幾種方法應該「團結一致,一致對外」。如何實現呢?利用工廠模式。

工廠模式如何實現?

相對於單例模式,上面我們提供了足夠的資訊,工廠類,工廠類裡面的靜態方法。靜態方法裡面new一下需要建立的物件例項就搞定了。當然至於考慮上面的第二個問題,根據工廠類靜態方法的引數,我們簡單做個判斷就好了。管你用if..else..還是switch..case..,能快速高效完成判斷該建立哪個類的工作就好了。最後,一定要記得,工廠類靜態方法返回乙個物件。不是兩個,更不是三個。

簡單的工廠模式:**如下:

單例工廠模式:

看了這麼多**,其實說白了就乙個道理:根據接收的條件,選擇合適的類。

這種方法與php web開發中mvc模式十分類似:根據uri引數,選擇不同的控制器類和實現方法。

其實在php資料庫設計時也可用到工廠模式,根據不同的引數,選擇不同的資料庫類。

php設計模式之單例模式使用示例

以下為單例模式 複製 如下 phpclass easyframework easy mysql public static function getinstance return self instance protected function clone x easyframework easy ...

PHP設計模式(一)單例模式

在物件導向程式設計中,我們會用到很多設計模式,比如常見的單例模式,工廠模式,模式,觀察者模式等等。每乙個模式,都能解決特定問題,是很多前輩經過很多實踐總結出來的。掌握並靈活運用它們,對於物件導向程式設計有很大的幫助。php中常用的設計模式有 class singlepattern return in...

php設計模式 一 單例模式

應用場景 資料庫連線這種比較費資源的操作 我們希望整個應用只實列化一次 結構 4私1公 私有化構造方法 防止使用 new 建立多個實列 私有化轉殖方法 防止clone多個實列 私有化重建方法 防止反序列化 私有化靜態屬性 防止直接訪問儲存實列的屬性 class signle1 return stat...