基礎設計模式:單例模式+工廠模式+注冊樹模式
單例模式:
通過提供自身共享實例的訪問,單例設計模式用于限制特定對象只能被創(chuàng)建一次。
使用場景:
一般數(shù)據(jù)庫實例都會用單例模式
實現(xiàn):
單例設計模式就是要一個類只能實例化一個對象。
要想讓一個類只能實例化一個對象,就要讓類先不能實例化對象,就是構造方法私有。
現(xiàn)在,要想實例化該類必須通過訪問靜態(tài)方法來實例化改類
為了防止實例多次,需要通過一個成員變量來控制加以判斷
因為靜態(tài)方法不能訪問非靜態(tài)成員,所以聲明的成員也要是靜態(tài)的,同時防止外部訪問該成員,還要私有
class Singleton{
private static $_instance; //聲明一個私有的,靜態(tài)的成員屬性$instance;
private function __construct(){} //構造方法私有,防止new實例化。
public static function getInstance(){ //只能通過靜態(tài)方法實例化對象
if( !( self::$_instance instanceof Singleton ) )
self::$_instance = new self();
return self::$obj;
}
private function __clone(){} //防止clone對象。
private function __wakeup(){} //防止使用序列化。
function query($sql){
echo $sql;
}
}
/*通過靜態(tài)方法實例化*/
$db = Singleton::getInstance();
//訪問對象中的成員
$db->query("select * from user");
工廠模式:
工廠類就是一個專門用來創(chuàng)建其它對象的類。所有地方加載類都走工廠方法。
注冊樹模式:
小工程并不實用,對于大工程方便管理生成對象。
三個模式的結合使用:
一個數(shù)據(jù)庫的單例模式,通過工廠方法調(diào)用,生成的對象注冊到注冊樹中。
<?php
/**
* 單例模式
*/
trait Singleton
{
private static $_instance;
private function __construct()
{
}
public static function getInstance()
{
if (!(self::$_instance instanceof Singleton)) {
self::$_instance = new Static();
}
return self::$_instance;
}
final private function __clone()
{
}
}
/**
* 數(shù)據(jù)庫類,通過trait使用單例模式
*/
class Database{
use Singleton;
public function query($sql)
{
//return ret...
}
}
/**
* 工廠方法,生成對象
*/
class Loader
{
/**
* 創(chuàng)建對象方法,創(chuàng)建成功加入注冊樹
* @param $cls
* @return null|static
*/
public static function loadObject($cls)
{
$obj = ObjectFinder::find($cls);
if (!is_object($obj)) {
$obj = $cls::getInstance();
ObjectFinder::register($cls, $obj);
}
return $obj;
}
}
/**
* 注冊樹類,存取工廠創(chuàng)建好的對象
*/
class ObjectFinder
{
protected static $_object;
/**
* 獲取類對應的對象
* @param $cls
* @return null
*/
public static function find($cls)
{
if (isset(self::$_object[$cls])) {
return self::$_object[$cls];
}
return null;
}
/**
* 注冊對象
* @param $cls
* @param $obj
* @return bool
*/
public static function register($cls, $obj)
{
if (!is_object($obj) || isset(self::$_object[$cls])) {
return false;
}
self::$_object[$cls] = $obj;
return true;
}
/**
* 銷毀對象
* @param $cls
*/
public static function destory($cls)
{
if (self::find($cls)) {
unset(self::$_object[$cls]);
}
}
}
//創(chuàng)建一個
$db = Loader::loadObject("Database");