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