單例模式和工廠模式
單例模式又稱為職責模式,它用來在程序中創建一個單一功能的訪問點,通俗地說就是實例化出來的對象是唯一的。
所有的單例模式至少擁有以下三種公共元素:
1. 它們必須擁有一個構造函數,並且必須被標記為private
2. 它們擁有一個保存類的實例的靜態成員變量
3. 它們擁有一個訪問這個實例的公共的靜態方法
單例類不能再其它類中直接實例化,只能被其自身實例化。它不會創建實例副本,而是會向單例類內部存儲的實例返回一個引用。
例子:
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。這樣如果想更改創建的對象類型,只需更改該工廠即可。
例子:
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