PHP------單例模式和工廠模式

                                                                                    單例模式和工廠模式函數

單例模式又稱爲職責模式,它用來在程序中建立一個單一功能的訪問點,通俗地說就是實例化出來的對象是惟一的。
全部的單例模式至少擁有如下三種公共元素:
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
相關文章
相關標籤/搜索