設計模式
單例模式解決的是如何在整個項目中建立唯一對象執行個體的問題,工廠模式解決的是如何不通過new建立執行個體對象的方法。
單例模式
- $_instance必須聲明為靜态的私有變量
- 構造函數和析構函數必須聲明為私有,防止外部程式new 類進而失去單例模式的意義
- getInstance()方法必須設定為公有的,必須調用此方法 以傳回執行個體的一個引用
- ::操作符隻能通路靜态變量和靜态函數
- new對象都會消耗記憶體
- 使用場景:最常用的地方是資料庫連接配接。
- 使用單例模式生成一個對象後, 該對象可以被其它衆多對象所使用。
- 私有的__clone()方法防止克隆對象
單例模式,使某個類的對象僅允許建立一個。構造函數private修飾,
申明一個static getInstance方法,在該方法裡建立該對象的執行個體。如果該執行個體已經存在,則不建立。比如隻需要建立一個資料庫連接配接。
工廠模式
工廠模式,工廠方法或者類生成對象,而不是在代碼中直接new。
使用工廠模式,可以避免當改變某個類的名字或者方法之後,在調用這個類的所有的代碼中都修改它的名字或者參數。
Test1
注冊模式
注冊模式,解決全局共享和交換對象。已經建立好的對象,挂在到某個全局可以使用的數組上,在需要使用的時候,直接從該數組上擷取即可。将對象注冊到全局的樹上。任何地方直接去通路。
<?
擴充卡模式
将各種截然不同的函數接口封裝成統一的API。
PHP中的資料庫操作有MySQL,MySQLi,PDO三種,可以用擴充卡模式統一成一緻,使不同的資料庫操作,統一成一樣的API。類似的場景還有cache擴充卡,可以将memcache,redis,file,apc等不同的緩存函數,統一成一緻。
首先定義一個接口(有幾個方法,以及相應的參數)。然後,有幾種不同的情況,就寫幾個類實作該接口。将完成相似功能的函數,統一成一緻的方法。
接口
MySQLi
PDO
通過以上案例,PHP與MySQL的資料庫互動有三套API,在不同的場景下可能使用不同的API,那麼開發好的代碼,換一個環境,可能就要改變它的資料庫API,那麼就要改寫所有的代碼,使用擴充卡模式之後,就可以使用統一的API去屏蔽底層的API差異帶來的環境改變之後需要改寫代碼的問題。
政策模式
政策模式,将一組特定的行為和算法封裝成類,以适應某些特定的上下文環境。
eg:假如有一個電商網站系統,針對男性女性使用者要各自跳轉到不同的商品類目,并且所有的廣告位展示不同的廣告。在傳統的代碼中,都是在系統中加入各種if else的判斷,寫死的方式。如果有一天增加了一種使用者,就需要改寫代碼。使用政策模式,如果新增加一種使用者類型,隻需要增加一種政策就可以。其他所有的地方隻需要使用不同的政策就可以。
首先聲明政策的接口檔案,約定了政策的包含的行為。然後,定義各個具體的政策實作類。
通過以上案例,PHP與MySQL的資料庫互動有三套API,在不同的場景下可能使用不同的API,那麼開發好的代碼,換一個環境,可能就要改變它的資料庫API,那麼就要改寫所有的代碼,使用擴充卡模式之後,就可以使用統一的API去屏蔽底層的API差異帶來的環境改變之後需要改寫代碼的問題。
FemaleUser
MaleUser
Page
執行結果圖:
總結:
通過以上方式,可以發現,在不同使用者登入時顯示不同的内容,但是解決了在顯示時的寫死的問題。如果要增加一種政策,隻需要增加一種政策實作類,然後在入口檔案中執行判斷,傳入這個類即可。實作了解耦。
以上内容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴充、高性能、高并發、伺服器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點進階進階幹貨需要的可以免費分享給大家
,需要請戳這裡連結 或 者關注咱們下面的知乎專欄PHP架構師圈子zhuanlan.zhihu.com