单例,工厂
單例模式又稱為職責(zé)模式,它用來在程序中創(chuàng)建一個單一功能的訪問點(diǎn),通俗地說就是實(shí)例化出來的對象是唯一的。
danli.class<?phpclass Danli{//保存類的實(shí)例的靜態(tài)成員變量static private $_instance=null;//私有的構(gòu)造方法private function __construct(){echo "這是一個構(gòu)造方法<br>";}//用于訪問類的實(shí)例的公共的靜態(tài)方法static public function getInstance(){if(!(self::$_instance instanceof Danli)){echo "實(shí)例化<br>";self::$_instance = new self;}return self::$_instance;}//類的其它方法public function test(){echo "調(diào)用成功<br>";}} index.php<?php//加載類文件require "Danli.php";//第一次調(diào)用類的實(shí)例$first = Danli::getInstance();$first->test();//第二次調(diào)用類的實(shí)例$second = Danli::getInstance();$second->test();
/*單例設(shè)計(jì)模式 (單態(tài)) 定義: 一個類 只能允許有 一個對象存在.?1.不讓進(jìn): 使類不能被實(shí)例化?2.留后門: 設(shè)置靜態(tài)方法?3.給對象: 在靜態(tài)方法里實(shí)例化該類?4.判初夜: 判斷是否是 第一次產(chǎn)生該類的對象?5.設(shè)靜態(tài): 靜態(tài)方法里 要使用靜態(tài)屬性 *//*//1.不讓進(jìn): 使類不能被實(shí)例化-----------------class Test{?// 設(shè)置 一個封裝的構(gòu)造方法?private function __construct() {?//占位, 我就是不讓你NEW我~~~?}}2.留后門: 設(shè)置靜態(tài)方法--------------------class Test{?// 設(shè)置 一個封裝的構(gòu)造方法?private function __construct() {?//占位, 我就是不讓你NEW我~~~?}?//后門?public static function getObject() {?echo "啊,我是后門,進(jìn)吧!<br>";?}}3.給對象: 在靜態(tài)方法里實(shí)例化該類------------------class Test{?// 設(shè)置 一個封裝的構(gòu)造方法?private function __construct() {?//占位, 我就是不讓你NEW我~~~?}?//后門?public static function getObject() {?echo "啊,我是后門,進(jìn)吧!<br>";return new self();//實(shí)例化一個對象給你?}}4.判初夜: 判斷是否是 第一次產(chǎn)生該類的對象------------------class Test{?private $obj = null;//屬性值為對象,默認(rèn)為null?// 設(shè)置 一個封裝的構(gòu)造方法?private function __construct() {?????//占位, 我就是不讓你NEW我~~~?}?//后門?public static function getObject() {?echo "啊,我是后門,進(jìn)吧!<br>";if ($this->obj === null) {?$this->obj = new self();//實(shí)例化一個對象}?//返回的屬性 其實(shí)就是本對象?return $this->obj;?}}5.設(shè)靜態(tài): 靜態(tài)方法里 要使用靜態(tài)屬性------------------class Test{?private static $obj = null;//屬性值為對象,默認(rèn)為null// 設(shè)置 一個封裝的構(gòu)造方法?private function __construct() {?//占位, 我就是不讓你NEW我~~~?}?//后門?public static function getObject() {?echo "啊,我是后門,進(jìn)吧!<br>";?????????if (self::$obj === null) {?self::$obj = new self();//實(shí)例化一個對象?}?//返回的屬性 其實(shí)就是本對象?return self::$obj;?}}Test::getObject();//使用靜態(tài)方法訪問該類里的方法exit;$t1 = Test::getObject();$t2 = Test::getObject();$t3 = Test::getObject();$t4 = Test::getObject();$t5 = Test::getObject();$t6 = Test::getObject();$t7 = Test::getObject();$t8 = Test::getObject();//判斷 兩個對象 是否是同一個對象if ($t1 === $t6) {?echo "哦, Yes! 是同一個實(shí)例<br>";} else {?echo "哦, No! 不是同一個實(shí)例<br>";} 最簡單的PHP單例模式的類:
class TestInstance { public static $_instance = null; //為了防止外部new這個類,所以構(gòu)造方法用protected,這是單例模式的關(guān)鍵之處 protected function __Construct() { echo 'Instance,Instance,Instance..........'; } //用一個靜態(tài)變量存儲類的實(shí)例,只有第一次實(shí)例化的時候才賦值,以后都直接給出靜態(tài)實(shí)例 public static function getInstance() { if(!isset(self::$_instance)){ self::$_instance = new static(); } return self::$_instance; } } 使用:
$aa = TestInstance::getInstance(); $aa->xx();$bb = TestInstance::getInstance(); $bb->xx()
從上面的代碼可以看出來,PHP的單例模式實(shí)現(xiàn)要求:
1、一個private的__construct是必須的,單例類不能在其它類中實(shí)例化,只能被自身實(shí)例化;2、擁有一個保存類的實(shí)例的靜態(tài)成員變量;
3、一個靜態(tài)的公共方法用于實(shí)例化這個類,并訪問這個類的實(shí)例;
工廠模式就是一種類,具有為您創(chuàng)建對象的某些方法,這樣就可以使用工廠類創(chuàng)建對象,而不直接使用new。這樣如果想更改創(chuàng)建的對象類型,只需更改該工廠即可。
class Factory {//創(chuàng)建一個基本的工廠類
? ? static public function fac($id){//創(chuàng)建一個返回對象實(shí)例的靜態(tài)方法? ? ? ? if(1 == $id) return new A();
? ? ? ? elseif(2==$id) return new B();
? ? ? ? elseif(3==$id) return new C();
? ? ? ? return new D();
? ? }
}
interface FetchName {//創(chuàng)建一個接口
? ? public function getname();
}
class A implements FetchName{
? ? private $name = "AAAAA";
? ? public function getname(){ return $this->name; }
}
class C implements FetchName{
? ? private $name = "CCCCC";
? ? public function getname(){ return $this->name; }
}
class B implements FetchName{
? ? private $name = "BBBBB";
? ? public function getname(){ return $this->name; }
}
class D implements FetchName{
? ? private $name = "DDDDD";
? ? public function getname(){ return $this->name; }
}
$o = Factory::fac(6);//調(diào)用工廠類中的方法
if($o instanceof FetchName){
? echo? $o->getname();//DDDDD
}
$p=Factory::fac(3);
echo $p->getname();//CCCCC
總結(jié)
- 上一篇: 怎么样将硬盘转为gpt硬盘 转换硬盘为G
- 下一篇: win10格式化 激活不了怎么办啊 wi