單例模式和工廠模式函數
單例模式又稱爲職責模式,它用來在程序中建立一個單一功能的訪問點,通俗地說就是實例化出來的對象是惟一的。
全部的單例模式至少擁有如下三種公共元素:
1. 它們必須擁有一個構造函數,而且必須被標記爲private
2. 它們擁有一個保存類的實例的靜態成員變量
3. 它們擁有一個訪問這個實例的公共的靜態方法
單例類不能再其它類中直接實例化,只能被其自身實例化。它不會建立實例副本,而是會向單例類內部存儲的實例返回一個引用。
例子:this
1 class Single { 2 private $name;//聲明一個私有的實例變量
3 private function __construct(){//聲明私有構造方法爲了防止外部代碼使用new來建立對象。
4
5 } 6
7 static public $instance;//聲明一個靜態變量(保存在類中惟一的一個實例)
8 static public function getinstance(){//聲明一個getinstance()靜態方法,用於檢測是否有實例對象
9 if(!self::$instance) self::$instance = new self(); 10 return self::$instance; 11 } 12
13 public function setname($n){ $this->name = $n; } 14 public function getname(){ return $this->name; } 15 } 16
17
18 $oa = Single::getinstance(); 19 $ob = Single::getinstance(); 20 $oa->setname('hello world'); 21 $ob->setname('good morning'); 22 echo $oa->getname();//good morning
23 echo $ob->getname();//good morning
工廠模式就是一種類,具備爲您建立對象的某些方法,這樣就能夠使用工廠類建立對象,而不直接使用new。這樣若是想更改建立的對象類型,只需更改該工廠便可。spa
例子:code
1 class Factory {//建立一個基本的工廠類
2 static public function fac($id){//建立一個返回對象實例的靜態方法
3 if(1 == $id) return new A(); 4 elseif(2==$id) return new B(); 5 elseif(3==$id) return new C(); 6 return new D(); 7 } 8 } 9
10 interface FetchName {//建立一個接口
11 public function getname();// 12 } 13
14 class A implements FetchName{ 15 private $name = "AAAAA"; 16 public function getname(){ return $this->name; } 17 } 18
19 class C implements FetchName{ 20 private $name = "CCCCC"; 21 public function getname(){ return $this->name; } 22 } 23 class B implements FetchName{ 24 private $name = "BBBBB"; 25 public function getname(){ return $this->name; } 26 } 27
28 class D implements FetchName{ 29 private $name = "DDDDD"; 30 public function getname(){ return $this->name; } 31 } 32
33
34 $o = Factory::fac(6);//調用工廠類中的方法
35 if($o instanceof FetchName){ 36 echo $o->getname();//DDDDD
37 } 38
39 $p=Factory::fac(3); 40 echo $p->getname();//CCCCC