单例模式:
通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次。
使用场景:
一般数据库实例都会用单例模式
实现:
单例设计模式就是要一个类只能实例化一个对象。
要想让一个类只能实例化一个对象,就要让类先不能实例化对象,就是构造方法私有。
现在,要想实例化该类必须通过访问静态方法来实例化改类
为了防止实例多次,需要通过一个成员变量来控制加以判断
因为静态方法不能访问非静态成员,所以声明的成员也要是静态的,同时防止外部访问该成员,还要私有
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");