1.工廠模式
工廠模式是一種類,它具有為您創建對象的某些方法,您可以使用工廠類創建對象,而不直接使用 new,這樣,如果您想要更改所創建的對象類型,只需更改該工廠即可,使用該工廠的所有代碼會自動更改。
主要作用是降低耦合度,代碼如下:
- abstract class Operation{
- abstract public function getValue($num1,$num2);
- public function getAttr(){
- return 1;
- }
- }
- class Add extends Operation{
- public function getValue($num1, $num2){
- return $num1+$num2;
- }
- }
- class Sub extends Operation{
- public function getValue($num1, $num2){
- return $num1-$num2;
- }
- }
- class Factory{
- public static function CreateObj($operation){
- switch ($operation){
- case '+': return new Add();
- case '-': return new Sub();
- }
- }
- }
- $Op=Factory::CreateObj('-');
- echo $Op->getValue(3, 6);
用在真正開發中一般當做數據庫選擇類。
實例2 顯示使用工廠方法的一個示例,代碼如下:
- <?php
- interface IUser
- {
- function getName();
- }
- class User implements IUser
- {
- public static function Load( $id )
- {
- return new User( $id );
- }
- public static function Create( )
- {
- return new User( null );
- }
- public function __construct( $id ) { }
- public function getName()
- {
- return "Jack";
- }
- }
- $uo = User::Load( 1 );
- echo( $uo->getName()."n" );
- ?>
這段代碼要簡單得多,它僅有一個接口 IUser 和一個實現此接口的 User 類,User 類有兩個創建對象的靜態方法.PHP里通過工廠模式提高效率
我們建立以下四個文件,代碼如下:
- //index.php
- <?php
- include_once("f.inc.php");
- $f=new factory;
- $t1=&$f->create('T1');
- echo $t1->getName();
- echo $config;
- ?>
- //f.inc.php
- <?php
- class factory
- {
- function factory()
- {
- $this->mClasses=array('T1'=>'t1.inc.php','T2'=>'t2.inc.php');
- }
- function &create($class)
- {
- if (!class_exists($class))
- {
- require_once($this->mClasses[$class]);
- }
- return new $class;
- }
- }
- ?>
- //t1.inc.php
- <?php
- global $config;
- $config='surfchen';
- class T1
- {
- var $mName='name::T1';
- function getName()
- {
- return $this->mName;
- }
- }
- ?>
- //t2.inc.php
- <?php
- class T2
- {
- function T2()
- {
- echo 't2 is ok';
- }
- }
- ?>
在index.php里,我們通過一個factory類來創建其他的類實例。
在factory里,保存有一個數組$this->mClasses,格式為array(“類名”=>”類文件路徑”).
我們通過factory::create()來創建一個類實例的時候,在create()里,會首先檢測類是否存在,如果不存在,就根據$this->mClasses把類對應的類文件包含進來。然后創建并返回一個該類的實例。
這樣,我們只需要把factory類文件包含進執行的腳本(如index.php)中就可以了,大家可能還注意到了在t1.inc.php中的這兩行代碼,代碼如下:global $config;$config='surfchen';
2.單例模式
簡單來說,PHP單例模式就是一個功能用一個類來實現,并且在整個應用程序當中只有一個這個類的實例存在;
工廠模式強調的是面向對象的多態性,它可以把功能上的差異部分封裝起來,對外實現共有的功能,比如說數據庫的鏈接,由于數據庫的不同,我們可能需要寫不同的方法去實現數據庫的鏈接,但作為應用程序來講,它不需要了解數據庫用的是MySQL還是Oracle,它只需要用query()這個方法去執行數據庫的相應操作即可,這樣就屏蔽了差異,使類更加健壯!代碼如下:
- class Mysql{
- public static $conn;
- public static function getInstance(){
- if (!self::$conn){
- new self();
- return self::$conn;
- }else {
- return self::$conn;
- }
- }
- private function __construct(){
- self::$conn= "mysql_connect:";// mysql_connect('','','')
- }
- public function __clone()
- {
- trigger_error("Only one connection");
- }
- }
- echo Mysql::getInstance();
- echo Mysql::getInstance();
實際中用作數據庫連接類和工廠模式一起使用,根據參數調用單例模式,可以提高資源使用效率.
新聞熱點
疑難解答