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