基础设计模式:单例模式+工厂模式+注册树模式
单例模式:
通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次。
使用场景:
一般数据库实例都会用单例模式
实现:
单例设计模式就是要一个类只能实例化一个对象。
要想让一个类只能实例化一个对象,就要让类先不能实例化对象,就是构造方法私有。
现在,要想实例化该类必须通过访问静态方法来实例化改类
为了防止实例多次,需要通过一个成员变量来控制加以判断
因为静态方法不能访问非静态成员,所以声明的成员也要是静态的,同时防止外部访问该成员,还要私有
class Singleton{
private static $_instance; //声明一个私有的,静态的成员属性$instance;
private function __construct(){} //构造方法私有,防止new实例化。
public static function getInstance(){ //只能通过静态方法实例化对象
if( !( self::$_instance instanceof Singleton ) )
self::$_instance = new self();
return self::$obj;
}
private function __clone(){} //防止clone对象。
private function __wakeup(){} //防止使用序列化。
function query($sql){
echo $sql;
}
}
/*通过静态方法实例化*/
$db = Singleton::getInstance();
//访问对象中的成员
$db->query("select * from user");
工厂模式:
工厂类就是一个专门用来创建其它对象的类。所有地方加载类都走工厂方法。
注册树模式:
小工程并不实用,对于大工程方便管理生成对象。
三个模式的结合使用:
一个数据库的单例模式,通过工厂方法调用,生成的对象注册到注册树中。
<?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()
{
}
}
/**
* 数据库类,通过trait使用单例模式
*/
class Database{
use Singleton;
public function query($sql)
{
//return ret...
}
}
/**
* 工厂方法,生成对象
*/
class Loader
{
/**
* 创建对象方法,创建成功加入注册树
* @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;
}
}
/**
* 注册树类,存取工厂创建好的对象
*/
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]);
}
}
}
//创建一个
$db = Loader::loadObject("Database");