單例模式
単例模式就是某個(gè)類只有一個(gè)實(shí)例,自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例
単例模式的實(shí)現(xiàn):
1:私有化一個(gè)屬性用于存放唯一的實(shí)例
2:私有化構(gòu)造方法
3:私有化克隆方法,用來(lái)創(chuàng)建并只允許創(chuàng)建一個(gè)實(shí)例
4:公有化靜態(tài)方法,用于向系統(tǒng)提供這個(gè)唯一實(shí)例
<?php
class Singleton {
//1.私有化屬性存放實(shí)例
private static $_instance = null;
//2.私有化構(gòu)造方法
private function __construct() {
}
//3.克隆方法私有化
private function __clone() {
// TODO: Implement __clone() method.
}
//4.公有化靜態(tài)方法,用于向系統(tǒng)提供這個(gè)唯一實(shí)例
public function getInstance() {
//如果不是當(dāng)前類的實(shí)例,那么實(shí)例化當(dāng)前類創(chuàng)建新實(shí)例
if(!self::$_instance instanceof self){
self::$_instance = new self();
}
return self::$_instance;
}
}
$obj1 = Singleton::getInstance();
$obj2 = Singleton::getInstance();
$obj3 = Singleton::getInstance();
var_dump($obj1,$obj2,$obj3);
#輸出
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}
因?yàn)殪o態(tài)方法可以在全局范圍內(nèi)被訪問(wèn),當(dāng)我們需要一個(gè)單例模式的對(duì)象時(shí),只需調(diào)用getInstance方法,獲取先前實(shí)例化的對(duì)象,無(wú)需重新實(shí)例化。
因?yàn)殪o態(tài)方法可以在全局范圍內(nèi)被訪問(wèn),當(dāng)我們需要一個(gè)單例模式的對(duì)象時(shí),只需調(diào)用getInstance方法,獲取先前實(shí)例化的對(duì)象,無(wú)需重新實(shí)例化。
優(yōu)點(diǎn): 1、在內(nèi)存里只有一個(gè)實(shí)例,減少了內(nèi)存的開(kāi)銷,尤其是頻繁的創(chuàng)建和銷毀實(shí)例(比如管理學(xué)院首頁(yè)頁(yè)面緩存)。 2、避免對(duì)資源的多重占用(比如寫文件操作)。
缺點(diǎn):沒(méi)有接口,不能繼承,與單一職責(zé)原則沖突,一個(gè)類應(yīng)該只關(guān)心內(nèi)部邏輯,而不關(guān)心外面怎么樣來(lái)實(shí)例化。
使用場(chǎng)景: 1、要求生產(chǎn)唯一序列號(hào)。 2、WEB 中的計(jì)數(shù)器,不用每次刷新都在數(shù)據(jù)庫(kù)里加一次,用單例先緩存起來(lái)。 3、創(chuàng)建的一個(gè)對(duì)象需要消耗的資源過(guò)多,比如 I/O 與數(shù)據(jù)庫(kù)的連接等。
注意事項(xiàng):getInstance() 方法中需要使用同步鎖 synchronized 防止多線程同時(shí)進(jìn)入造成 instance 被多次實(shí)例化
上一篇 php設(shè)計(jì)模式之工廠模式
下一篇 php設(shè)計(jì)模式之注冊(cè)樹(shù)模式