基础设计模式:单例模式+工厂模式+注册树模式
單例模式:
通過提供自身共享實(shí)例的訪問,單例設(shè)計(jì)模式用于限制特定對(duì)象只能被創(chuàng)建一次。
使用場(chǎng)景:
一般數(shù)據(jù)庫(kù)實(shí)例都會(huì)用單例模式
實(shí)現(xiàn):
單例設(shè)計(jì)模式就是要一個(gè)類只能實(shí)例化一個(gè)對(duì)象。
要想讓一個(gè)類只能實(shí)例化一個(gè)對(duì)象,就要讓類先不能實(shí)例化對(duì)象,就是構(gòu)造方法私有。
現(xiàn)在,要想實(shí)例化該類必須通過訪問靜態(tài)方法來實(shí)例化改類
為了防止實(shí)例多次,需要通過一個(gè)成員變量來控制加以判斷
因?yàn)殪o態(tài)方法不能訪問非靜態(tài)成員,所以聲明的成員也要是靜態(tài)的,同時(shí)防止外部訪問該成員,還要私有
class Singleton{private static $_instance; //聲明一個(gè)私有的,靜態(tài)的成員屬性$instance;private function __construct(){} //構(gòu)造方法私有,防止new實(shí)例化。public static function getInstance(){ //只能通過靜態(tài)方法實(shí)例化對(duì)象if( !( self::$_instance instanceof Singleton ) )self::$_instance = new self();return self::$obj;}
private function __clone(){} //防止clone對(duì)象。
private function __wakeup(){} //防止使用序列化。
function query($sql){echo $sql;} }/*通過靜態(tài)方法實(shí)例化*/ $db = Singleton::getInstance();//訪問對(duì)象中的成員 $db->query("select * from user");
?工廠模式:
工廠類就是一個(gè)專門用來創(chuàng)建其它對(duì)象的類。所有地方加載類都走工廠方法。
注冊(cè)樹模式:
小工程并不實(shí)用,對(duì)于大工程方便管理生成對(duì)象。
三個(gè)模式的結(jié)合使用:
一個(gè)數(shù)據(jù)庫(kù)的單例模式,通過工廠方法調(diào)用,生成的對(duì)象注冊(cè)到注冊(cè)樹中。
<?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ù)庫(kù)類,通過trait使用單例模式*/ class Database{use Singleton;public function query($sql){//return ret... } }/*** 工廠方法,生成對(duì)象*/ class Loader {/*** 創(chuàng)建對(duì)象方法,創(chuàng)建成功加入注冊(cè)樹* @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;} }/*** 注冊(cè)樹類,存取工廠創(chuàng)建好的對(duì)象*/ class ObjectFinder {protected static $_object;/*** 獲取類對(duì)應(yīng)的對(duì)象* @param $cls* @return null*/public static function find($cls){if (isset(self::$_object[$cls])) {return self::$_object[$cls];}return null;}/*** 注冊(cè)對(duì)象* @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;}/*** 銷毀對(duì)象* @param $cls*/public static function destory($cls){if (self::find($cls)) {unset(self::$_object[$cls]);}} }//創(chuàng)建一個(gè) $db = Loader::loadObject("Database");
?
轉(zhuǎn)載于:https://www.cnblogs.com/leezhxing/p/3647369.html
總結(jié)
以上是生活随笔為你收集整理的基础设计模式:单例模式+工厂模式+注册树模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 伙伴们在教父母用手机和平板时有没有什么好
- 下一篇: 梦想的地方!地球上最值得去的20个地方【