首頁 後端開發 php教程 php模式設計之 單例模式

php模式設計之 單例模式

Jul 30, 2016 pm 01:30 PM
new private protected public self

  模式設計是什麼?初學者一開始會被這高大上的名稱給唬住。而對於有豐富程式經驗的老鳥來說,模式設計又是無所不在。很多接觸的框架是基於各種模式設計而形成的。 簡單說,在寫程式碼的過程中一開始往往接觸的是面向過程的,簡單的基礎的程式設計。這時候我們往往追求的是程式碼能夠實現某項功能就萬事大吉。管他程式碼多麼冗餘,管他程式碼是否可重用,管他效率如何,能實現功能就好。但是,真正應用於實際的,更被大家採納的是那些高效的,可重用的,便於團隊開發的程式碼。基於這些因素,你不能像練手一樣,隨便命名函數名,隨便放腳本。模式設計告訴是給人們組織程式碼提供一個思路,實現可重複使用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。 

  在所有模式設計中,有三種基礎設計模式,單例模式,工廠模式,註冊樹模式,其他模式往往基於這幾種模式,今天帶來的是單例模式。

什麼是單例模式?

  根據這個名稱,我們很容易了解到,單例模式指的是整個應用中只有一個物件實例的設計模式。

為什麼要用單例模式?

php常常和資料庫打交道,如果在應用中如果頻繁建立連接對象,進行new操作的話,會消耗大料的系統記憶體資源,這並不是我們希望看到的。再則,在團隊合作專案中,單例模式可以有效避免不同程式設計師new自己的對象,造成人為的系統消耗。

 如何建立單例模式?

  在看到這個問題的時候,相信優秀的程式設計師很可能自己試著根據要求去創建單例模式,而不是坐等前人的經驗。有別於其他博友告訴你什麼樣的模式是單例模式,我人更願意和有物件導向程式設計基本經驗的你考慮一下如何自己建立單例模式。

  我們先從題目出發,單例模式是只有一個物件實例的設計模式。這一點是很讓人蛋疼的。我們平常創建的類別不是能創建很多物件的,就是不能創建物件的(抽象類別)。要建立物件需要有類別這是必須的,而且不能是抽象類別。這個類別要防止別人可以多次創建函數。我們自然而然地考慮到了從構造函數入手。但是,每次new操作都會呼叫建構函數,也就是會多次建立物件實例。這和我們設計初衷相悖了。在此務必申明建構函式為private或protected這樣才能解決這個問題。

  建構子被申明為private或protected這注定無法透過new的方法建立實例物件了。而我們發現,經過這一步處理後,解決問題的前景變得明朗起來?為什麼呢?既然無法透過new方法建立物件實例,那麼我們只能透過類別內的方法來建立物件實例了。 這時候我們面臨一個有趣的先有雞還是先有蛋的問題。我們往往往往是創建了物件後才呼叫物件的方法,而此時需要呼叫類別裡面的方法來建立物件。不受是否創建物件影響都能呼叫的方法的解決方案毋庸置疑那就是利用關鍵字--static。

  在類別內建立靜態方法完成完成什麼工作呢?回歸主題:確保只建立一個實例物件。如何確保只有一個?這很簡單,if判斷一下。存在的話直接返回,不存在自己創建一個嘛。當然這個實例物件是類別的靜態屬性。至此,單例模式要求的功能實現完成。真的完成了麼?還不算~如果有個類別繼承本類,將構造方法申明為public那不又壞事兒了?那有必要在構造方法前面加final關鍵字了。

  最後貼上單例模式代碼,程式碼解釋都在上面了~~

<?<span>php
</span><span>class</span><span> Single{
    </span><span>public</span><span>$hash</span><span>;
    </span><span>static</span><span>protected</span><span>$ins</span>=<span>null</span><span>;
    </span><span>final</span><span>protected</span><span>function</span><span> __construct(){
        </span><span>$this</span>->hash=<span>rand</span>(1,9999<span>);
    }

    </span><span>static</span><span>public</span><span>function</span><span> getInstance(){
        </span><span>if</span> (self::<span>$ins</span><span> instanceof self) {
            </span><span>return</span> self::<span>$ins</span><span>;
        }
        self</span>::<span>$ins</span>=<span>new</span><span> self();
        </span><span>return</span> self::<span>$ins</span><span>;
    } 
}</span>
登入後複製

  本身單例模式並不復雜,但需要深入理解。很多初學者依舊會感嘆:臥槽,構造方法原來不一直是public啊~臥槽還可以不透過new創建對像啊~其實筆者想說,不管構造方法被申明為public,private還是protected,最終創建對象的時候都會呼叫。一直是new創建對象實例,單例模式也用new創建對象,只是換個地方而已,從類別外到類別內。

  最後對研究出各種精妙的模式設計的程式設計師表示拜服~~

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

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1662
14
CakePHP 教程
1418
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
為什麼NameResolutionError(self.host, self, e) from e,怎麼解決 為什麼NameResolutionError(self.host, self, e) from e,怎麼解決 Mar 01, 2024 pm 01:20 PM

報錯的原因NameResolutionError(self.host,self,e)frome是由urllib3函式庫中的例外類型,這個錯誤的原因是DNS解析失敗,也就是說,試圖解析的主機名稱或IP位址無法找到。這可能是由於輸入的URL位址不正確,或DNS伺服器暫時無法使用所導致的。如何解決解決此錯誤的方法可能有以下幾種:檢查輸入的URL地址是否正確,確保它是可訪問的確保DNS伺服器可用,您可以嘗試在命令行中使用"ping"命令來測試DNS伺服器是否可用嘗試使用IP位址而不是主機名稱來存取網站如果是在代理

iOS的developer版和public版有什麼不同? iOS的developer版和public版有什麼不同? Mar 01, 2024 pm 12:55 PM

每年Apple發布新的iOS和macOS大版本之前,用戶都可以提前幾個月下載測試版搶先體驗一番。由於大眾和開發人員都使用該軟體,蘋果公司為兩者推出了developer和public版即開發者測試版的公共測試版。 iOS的developer版和public版有什麼差別呢?從字面上的意思來說,developer版是開發者測試版,public版是公共測試版。 developer版和public版面向的物件不同。 developer版是蘋果公司給開發者測試使用的,需要蘋果開發者帳號才能收到下載併升級,是

java中private是什麼意思 java中private是什麼意思 Nov 24, 2022 pm 06:27 PM

在java中,private的意思為“私有的”,是一種存取控制修飾符,用於修飾類別、屬性和方法。用private修飾的類別成員,只能被該類別本身的方法存取和修改,而不能被任何其他類別(包括該類別的子類別)存取和引用;因此​​,private修飾符具有最高的保護等級。

Python中的self怎麼使用 Python中的self怎麼使用 May 17, 2023 pm 10:40 PM

在介紹Python的self用法之前,先來介紹下Python中的類別和實例我們知道,物件導向最重要的概念就是類別(class)和實例(instance),類別是抽象的模板,例如學生這個抽象的事物,可以用一個Student類別來表示。而實例是根據類別創建出來的一個個具體的“物件”,每個物件都從類別中繼承有相同的方法,但各自的資料可能不同。 1.以Student類別為例,在Python中,定義類別如下:classStudent(object):pass(Object)表示該類別從哪個類別繼承下來的,Object類別是所有

Java 函數的存取權限修飾符之 private 詳解 Java 函數的存取權限修飾符之 private 詳解 Apr 25, 2024 pm 04:48 PM

private是一種Java訪問權限修飾符,它限制函數的可訪問性,只允許在定義它的類別中訪問,包括:在其他類別中無法存取該函數。在子類別中也無法存取該函數。

go語言中make和new的差別是什麼 go語言中make和new的差別是什麼 Jan 09, 2023 am 11:44 AM

區別:1、make只能用來分配及初始化類型為slice、map、chan的資料;而new可以分配任意類型的資料。 2.new分配返回的是指針,即類型「*Type」;而make返回引用,即Type。 3.new分配的空間會被清除;make分配空間後,會初始化。

Java 函數的存取權限修飾符之 public 使用指南 Java 函數的存取權限修飾符之 public 使用指南 Apr 26, 2024 am 08:39 AM

Javapublic存取權限修飾符允許函數從任何位置訪問,用於聲明公共API、定義跨包或類別共享的工具和實用程式。具體用法如下:語法:public返回值類型函數名稱(參數列表){...}場景:需要從任何地方存取的函數、公共API中的方法、共享的工具或實用程序

在Java中,我們可以將頂級類別聲明為protected或private嗎? 在Java中,我們可以將頂級類別聲明為protected或private嗎? Sep 12, 2023 pm 07:21 PM

不,我們不能將頂級類別聲明為私有或受保護。它可以是公共或預設(無修飾符)。如果沒有修飾符,則應該具有預設存取權限。語法//Atoplevelclass  publicclassTopLevelClassTest{   //Classbody}如果將一個頂級類別宣告為私有(private),編譯器將會報錯,提示「在此處不允許使用修飾符private」。這意味著頂級類別不能是私有的,同樣也適用於protected訪問

See all articles