突然發現自己關於 PHP 的部分寫得很少
補一篇 Singleton Pattern
最簡單也最實用
網路上有篇舉例得很好
說我們建立了一個類別 P
裡面可能呼叫(或載入)了其他的類別(如 C, D, E)
在某些情況下
我們並不希望類別 P 被重複呼叫多次時
類別 C D E 被重複建立
所以才會有這個 Singleton 的策略模式
實作如下
Controller
<?php
Class Test_Controller
{
public $load = null;
public $db = null;
public function __construct()
{
$this->init();
}
private function init()
{
# 載入共用的 loader
$this->load = load::instance();
# 取得 db 連線
$this->db = $this->load->database();
}
public function __destruct()
{
if(@$this->db) $this->db->close();
}
}
Loader
<?php
final class load
{
static $load = null;
static $db = null;
static $api = null;
public static function instance()
{
if(self::$load == null)
{
self::$load = new load();
}
return self::$load;
}
public static function database($host_name = 'test_cloud', $db_name = '')
{
if(self::$db == null)
{
self::$db = new db();
}
return self::$db->$host_name($db_name);
}
}
之後就可以測試看看
當你呼叫(或繼承) Test_Controller 多次之後
load 跟 db 應該都只會有一個實體
以前對於 Singleton 的認知
只是減少了一些不必要的呼叫
對於小公司而言
感受不大
直到目前轉到電商工作之後
才發覺
在大量被訪問的狀況之下
主機的記憶體與DB的連線數
是需要被嚴格控管的
不然硬體在怎麼擴充都不夠
尤其 database transaction 的問題
如果沒有用 Singleton 的話
commit 會亂七八糟的
所以認識 Singleton Pattern 真的是很重要的一件事情
提供給大家參考
沒有留言:
張貼留言