一 .三種常用基礎(chǔ)設(shè)計(jì)模式
1.工廠模式:使用工廠方法或者類生成對(duì)象,而不是在代碼中直接使用new方法。
2.單例模式:使 某個(gè)類的對(duì)象只允許被創(chuàng)建一次。
3.注冊(cè)模式:解決全局共享和交換對(duì)象。
工廠模式demo
step1創(chuàng)建工廠類 factory.php:
class factory{
public static function createDatabase(){
$db = new dataBase();
return $db;
}
}
step2 創(chuàng)建index.php 在index中調(diào)用factory工廠類:
//普通模式 $db = new dataBase(); //工廠模式 $db = factory::createDatabase();
優(yōu)點(diǎn) 好處
假設(shè)database類在很多php文件中使用惶岭。很多php文件中new database(),如果database類有所改變,例如名稱或者參數(shù)有所變動(dòng)犯眠,普通模式下每個(gè)使用dadatabase的地方都要改變按灶。工廠模式下只修改一處地方即可。而且其他很多高級(jí)的設(shè)計(jì)模式都依賴工廠模式筐咧。
單例模式demo
場(chǎng)景:假設(shè)有個(gè)數(shù)據(jù)庫(kù)類實(shí)現(xiàn)連接到數(shù)據(jù)庫(kù)鸯旁,有很多個(gè)php文件都創(chuàng)建了數(shù)據(jù)庫(kù)的連接,這對(duì)資源造成浪費(fèi)量蕊。實(shí)際只需要一個(gè)數(shù)據(jù)庫(kù)連接铺罢。這時(shí)候可以使用單例模式。
** step1 將database類構(gòu)造函數(shù)設(shè)為私有**
database.php:
class database{
protected $db;
/*將構(gòu)造函數(shù)設(shè)為私有函數(shù)
這樣外部就不能 new database() 屏蔽外部構(gòu)造
*/
private function __contrust(){}
public static function getInstrance(){
if(self::$db){
return self::$db;
}
else{
self::$db= new self();
return self::$db;
}
}
public function where(){}
public function order(){}
}
step2 在index.php 調(diào)用getInstrance 獲取實(shí)例
$db = database::getInstrance();
這樣無(wú)論調(diào)用多少次getInstrance() 只創(chuàng)建了一個(gè)實(shí)例残炮。
-
工廠模式+單例模式
在factory.php 中調(diào)用getInstrance()
public static function createDatabase(){
$db = database::getInstrance();
return $db;
}
這樣就實(shí)現(xiàn)了單例模式+工廠模式韭赘。
demo注冊(cè)樹(shù)模式注冊(cè)器模式
- step1 創(chuàng)建register.php 用來(lái)將一些對(duì)象注冊(cè)到全局的樹(shù)上,用來(lái)被一些地方直接訪問(wèn)势就。
class register{
protected static $object;
public static function set($alias,$object){
self::$object[$alias] = $object;
}
public static function _unset($alias){
unset(self::$object[$alias] );
}
public static function get($alias){
return self::$object[$alias];
}
}
- step2將產(chǎn)生數(shù)據(jù)庫(kù)連接 注冊(cè)到全局樹(shù)中
class factory{
public static function createDatabase(){
$db = database::getInstrance();
register::set('db1',$db);
return $db;
}
}
**step3 這樣就可以在其他地方直接獲取對(duì)象 **
index.php中
register::get('db1');
補(bǔ)充
具體什么時(shí)候注冊(cè)泉瞻,什么時(shí)候卸載可以在環(huán)境初始化的時(shí)候等楷怒,再根據(jù)邏輯來(lái)定。