程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php中設計模式工廠模式和單例模式實例

php中設計模式工廠模式和單例模式實例

編輯:關於PHP編程

php中設計模式工廠模式和單例模式實例,有需要的朋友可參考一下。

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 類有兩個創建對象的靜態方法。此關系可用圖 2 中的 UML 表示


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();
 

實際中用作數據庫連接類和工廠模式一起使用,根據參數調用單例模式,可以提高資源使用效率

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved