單例模式和工廠模式函數
單例模式又稱爲職責模式,它用來在程序中建立一個單一功能的訪問點,通俗地說就是實例化出來的對象是惟一的。
全部的單例模式至少擁有如下三種公共元素:
1. 它們必須擁有一個構造函數,而且必須被標記爲private
2. 它們擁有一個保存類的實例的靜態成員變量
3. 它們擁有一個訪問這個實例的公共的靜態方法
單例類不能再其它類中直接實例化,只能被其自身實例化。它不會建立實例副本,而是會向單例類內部存儲的實例返回一個引用。
例子:this
class Single { private $name;//聲明一個私有的實例變量 private function __construct(){//聲明私有構造方法爲了防止外部代碼使用new來建立對象。 } static public $instance;//聲明一個靜態變量(保存在類中惟一的一個實例) static public function getinstance(){//聲明一個getinstance()靜態方法,用於檢測是否有實例對象 if(!self::$instance) self::$instance = new self(); return self::$instance; } public function setname($n){ $this->name = $n; } public function getname(){ return $this->name; } } $oa = Single::getinstance(); $ob = Single::getinstance(); $oa->setname('hello world'); $ob->setname('good morning'); echo $oa->getname();//good morning echo $ob->getname();//good morning
工廠模式就是一種類,具備爲您建立對象的某些方法,這樣就能夠使用工廠類建立對象,而不直接使用new。這樣若是想更改建立的對象類型,只需更改該工廠便可。spa
例子:code
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