一,什麼是工廠模式?
1,含義:在類中定義一些抽象的方法,用於在子類中實現,
繼承自抽象類中的子類,用於實現基類中的抽象的方法
用於實例化所有相應的子類,當我們在寫一個項目的時候,爲了在合適的時候找到相應的類,避免將new分散到項目的各個角
落,這樣不僅邏輯混亂,而且維護不方便,我們就應用了簡單的工廠模式。
2,實例:
<?php class YunSuan { public $a; public $b; function Suan() { } } class Jia extends YunSuan { function Suan() { return $this->a+$this->b; } } class Jian extends YunSuan { function Suan() { return $this->a-$this->b; } } //到此爲止與第二種方式一樣 ;目的是解決當有很多子類時,方法名可能會重,從而通過運算符的不同來確定不同的類 class GongChang { static function ShengChan($f) { switch($f) { case "+": return new Jia(); break; case "-": return new Jian(); break; } } } $r = GongChang::ShengChan("-"); $r->a=10; $r->b=5; echo $r->Suan(); ?>
二、什麼是單例模式?
1、含義
作爲對象的創建模式,單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統全局地提供這個實例。它不會創建實例副本,而是會向單例類內部存儲的實例返回一個引用。
2、單例模式的三個要點:
(1). 需要一個保存類的唯一實例的靜態成員變量:
private static $_instance;
(2). 構造函數和克隆函數必須聲明爲私有的,防止外部程序new類從而失去單例模式的意義:
(3). 必須提供一個訪問這個實例的公共的靜態方法(通常爲getInstance方法),從而返回唯一實例的一個引用
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance=new self();
}
return self::$_instance;
}
二、爲什麼要使用單例模式?
1、PHP缺點:
php語言是一種解釋型的腳本語言,這種運行機制使得每個PHP頁面被解釋執行後,所有的相關資源都會被回收。也就是說,PHP在語言級別上沒有辦法讓某個對象常駐內存,這和asp.NET、Java等編譯型是不同的,比如在Java中單例會一直存在於整個應用程序的生命週期裏,變量是跨頁面級的,真正可以做到這個實例在應用程序生命週期中的唯一性。然而在PHP中,所有的變量無論是全局變量還是類的靜態成員,都是頁面級的,每次頁面被執行時,都會重新建立新的對象,都會在頁面執行完畢後被清空,這樣似乎PHP單例模式就沒有什麼意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現多個應用場景並需要共享同一對象資源時是非常有意義的。
2、單例模式在PHP中的應用場合:
(1)、應用程序與數據庫交互
一個應用中會存在大量的數據庫操作,比如過數據庫句柄來連接數據庫這一行爲,使用單例模式可以避免大量的new操作,因爲每一次new操作都會消耗內存資源和系統資源。
(2)、控制配置信息
如果系統中需要有一個類來全局控制某些配置信息, 那麼使用單例模式可以很方便的實現.
三、如何實現單例模式?
1、普通的數據庫訪問例子:
<?php
$db=new DB(...);//初始化一個數據庫句柄
$db->addUserInfo(...);//添加用戶信息
//在函數中訪問數據庫,查找用戶信息
function getUserInfo(){
$db=new DB(...);//再次new 數據庫類,和數據庫建立連接
$db=query(...);//根據查詢語句訪問數據庫
}
2、應用單例模式對數據庫進行操作:
<?php
class DB{
private $_db;
private static $_instance;
private function __construct(){
$this->_db=pg_connect(...);
}
private function clone(){}
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance=new self();
}
return self::$_instance;
}
publilc function addUserInfo(){}
public function getUserInfo(){}
}
$db=DB::getInstance();
$db->addUserInfo(...);
$db->getUserInfo(...);