#### 1. 單例模式 --- 單例:一個(gè)類(lèi)最多只能有一個(gè)對(duì)象,目的:保護(hù)資源的唯一性 單例模式(Singleton):通過(guò)代碼實(shí)現(xiàn)單例的設(shè)計(jì)思路、一個(gè)類(lèi)最多只能產(chǎn)生一個(gè)對(duì)象的設(shè)計(jì)思想 #### 2. 三私一公 --- 單例模式設(shè)計(jì)規(guī)范:三私一公 + 私有化構(gòu)造方法: 禁止在類(lèi)外無(wú)限實(shí)例化對(duì)象 + 私有化克隆方法: 禁止對(duì)象無(wú)限克隆對(duì)象 + 私有化靜態(tài)屬性: 保存類(lèi)內(nèi)部實(shí)例化得到的對(duì)象 + 公有化靜態(tài)方法: 允許外部通過(guò)調(diào)用類(lèi)內(nèi)部方法獲取對(duì)象 **a. 私有化構(gòu)造方法** ``` 對(duì)象的產(chǎn)生方式之一是通過(guò)實(shí)例化類(lèi),而在類(lèi)外部實(shí)例化是一種不可控行為,所以應(yīng)該禁止類(lèi)在外部被實(shí)例化 類(lèi)在外部實(shí)例化本質(zhì)上是在類(lèi)外部調(diào)用了構(gòu)造方法, 私有化構(gòu)造方法可使其不能在類(lèi)外部掉用構(gòu)造方法,也就是實(shí)現(xiàn)了禁止類(lèi)在外部被實(shí)例化``` **b. 公有靜態(tài)方法** ``` 私有化構(gòu)造方法只是不能在類(lèi)外部實(shí)例化類(lèi),但是可以在類(lèi)里面實(shí)例化,沒(méi)有對(duì)象,還想要訪(fǎng)問(wèn)類(lèi)中的方法,所以需要定義一個(gè)公有靜態(tài)方法,用于獲取類(lèi)的實(shí)例(對(duì)象)``` **c. 私有化靜態(tài)屬性** ``` 提供公有靜態(tài)方法后,無(wú)限調(diào)用靜態(tài)方法依然可以得到多個(gè)對(duì)象。 要想只返回一個(gè),則可將第一次產(chǎn)生的對(duì)象保存起來(lái),以后如果要獲取對(duì)象直接返回第一次產(chǎn)生的對(duì)象``` **d. 私有化克隆方法** ``` 在類(lèi)外部可以通過(guò)克隆對(duì)象來(lái)產(chǎn)生新的對(duì)象,私有化克隆方法可實(shí)現(xiàn)禁止類(lèi)在外部被克隆``` #### 3. 單例模式設(shè)計(jì)類(lèi) --- ```php /** * 單例模式設(shè)計(jì) */ class Singleton { /** * 私有靜態(tài)屬性 * 保存產(chǎn)生的對(duì)象 */ private static $obj; /** * 私有化構(gòu)造方法 * 禁止類(lèi)在外部實(shí)例化 */ private function __construct(){} /** * 類(lèi)的入口 * 用于獲取類(lèi)的實(shí)例 */ public static function getInstance() { if (self::$obj instanceof self) { return self::$obj; } else { self::$obj = new self; return self::$obj; } } /** * 私有化克隆方法 * 禁止類(lèi)的實(shí)例在外部被克隆 */ private function __clone(){} } ```