設(shè)計(jì)模式之單例模式
單例模式
1、定義:
單例(Singleton)模式的定義:指一個(gè)類(lèi)只有一個(gè)實(shí)例,且該類(lèi)能自行創(chuàng)建這個(gè)實(shí)例的一種模式。
2、特點(diǎn):
- 單例類(lèi)只有一個(gè)實(shí)例對(duì)象;
- 該單例對(duì)象必須由單例類(lèi)自行創(chuàng)建;
- 單例類(lèi)對(duì)外提供一個(gè)訪(fǎng)問(wèn)該單例的全局訪(fǎng)問(wèn)點(diǎn);
3、應(yīng)用場(chǎng)景
- 在應(yīng)用場(chǎng)景中,某類(lèi)只要求生成一個(gè)對(duì)象的時(shí)候,如一個(gè)班中的班長(zhǎng)、每個(gè)人的身份證號(hào)等。
- 當(dāng)對(duì)象需要被共享的場(chǎng)合。由于單例模式只允許創(chuàng)建一個(gè)對(duì)象,共享該對(duì)象可以節(jié)省內(nèi)存,并加快對(duì)象訪(fǎng)問(wèn)速度。如 Web 中的配置對(duì)象、數(shù)據(jù)庫(kù)的連接池等。
- 當(dāng)某類(lèi)需要頻繁實(shí)例化,而創(chuàng)建的對(duì)象又頻繁被銷(xiāo)毀的時(shí)候,如多線(xiàn)程的線(xiàn)程池、網(wǎng)絡(luò)連接池等。
4、PHP 單例模式的實(shí)現(xiàn):
單例模式是設(shè)計(jì)模式中最簡(jiǎn)單的模式之一。通常,普通類(lèi)的構(gòu)造函數(shù)是公有的,外部類(lèi)可以通過(guò)“new 構(gòu)造函數(shù)()”來(lái)生成多個(gè)實(shí)例。
但是,如果將類(lèi)的構(gòu)造函數(shù)設(shè)為私有的,外部類(lèi)就無(wú)法調(diào)用該構(gòu)造函數(shù),也就無(wú)法生成多個(gè)實(shí)例。這時(shí)該類(lèi)自身必須定義一個(gè)靜態(tài)私有實(shí)例,并向外提供一個(gè)靜態(tài)的公有函數(shù)用于創(chuàng)建或獲取該靜態(tài)私有實(shí)例。
簡(jiǎn)單記作:三私一公:
-
- 私有的構(gòu)造方法:外部無(wú)法調(diào)用,也就無(wú)法生成多個(gè)實(shí)例
- 私有的克隆方法:防止克隆
- 私有的靜態(tài)屬性:存儲(chǔ)唯一實(shí)例化的對(duì)象
- 公有的靜態(tài)方法:實(shí)例化該類(lèi)本身
代碼:
<?php class Single{ //私有的靜態(tài)屬性 private static $_instance=null; //私有的構(gòu)造方法 private function __construct(){ echo 'Single Mode'; } //私有的克隆方法 private function __clone(){} //公有的靜態(tài)方法 //實(shí)例化前先判斷該類(lèi)是否已被實(shí)例化了,若已被實(shí)例化,就返回該實(shí)例化對(duì)象;若沒(méi)被實(shí)例化,便實(shí)例化一個(gè)對(duì)象并將該對(duì)象保存在類(lèi)的靜態(tài)屬性中 public static function getInstance(){ if(self::$_instance===null){ self::$_instance = new self(); } return self::$_instance; } } $test = Single::getInstance(); var_dump($test); ?>

浙公網(wǎng)安備 33010602011771號(hào)