php专区

 首页 > php专区 > PHP应用 > 常用功能 > php中设计模式工厂模式和单例模式实例 - php高级

php中设计模式工厂模式和单例模式实例 - php高级

分享到:
【字体:
导读:
          1 工厂模式工厂模式是一种类,它具有为您创建对象的某些方法,您可以使用工厂类创建对象,而不直接使用 new,这样,如果您想要更改所创建的对象...

php中设计模式工厂模式和单例模式实例

1.工厂模式

工厂模式是一种类,它具有为您创建对象的某些方法,您可以使用工厂类创建对象,而不直接使用 new,这样,如果您想要更改所创建的对象类型,只需更改该工厂即可,使用该工厂的所有代码会自动更改。

主要作用是降低耦合度,代码如下:

  1. abstract class Operation{ 
  2.     abstract public  function getValue($num1,$num2); 
  3.     public  function getAttr(){ 
  4.         return 1; 
  5.     } 
  6. class Add extends Operation{ 
  7.     public function getValue($num1$num2){         
  8.         return $num1+$num2
  9.     } 
  10. class Sub extends Operation{ 
  11.     public function getValue($num1$num2){ 
  12.         return $num1-$num2
  13.     } 
  14. class Factory{ 
  15.     public static function CreateObj($operation){ 
  16.          
  17.         switch ($operation){ 
  18.             case '+'return new Add(); 
  19.             case '-'return new Sub(); 
  20.         } 
  21.          
  22.     } 
  23. $Op=Factory::CreateObj('-'); 
  24. echo $Op->getValue(3, 6); 

用在真正开发中一般当做数据库选择类。

实例2 显示使用工厂方法的一个示例,代码如下:

  1. interface IUser 
  2.   function getName(); 
  3. class User implements IUser 
  4.   public static function Load( $id )  
  5.   { 
  6.         return new User( $id ); 
  7.   } 
  8.   public static function Create( )  
  9.   { 
  10.         return new User( null ); 
  11.   } 
  12.   public function __construct( $id ) { } 
  13.   public function getName() 
  14.   { 
  15.     return "Jack"
  16.   } 
  17. $uo = User::Load( 1 ); 
  18. echo$uo->getName()."n" ); 
  19. ?> 

这段代码要简单得多,它仅有一个接口 IUser 和一个实现此接口的 User 类,User 类有两个创建对象的静态方法.PHP里通过工厂模式提高效率

我们建立以下四个文件,代码如下:

  1. //index.php 
  2. include_once("f.inc.php"); 
  3. $f=new factory; 
  4. $t1=&$f->create('T1'); 
  5. echo $t1->getName(); 
  6. echo $config; 
  7. ?> 
  8. //f.inc.php 
  9. class factory 
  10.  function factory() 
  11.  { 
  12.   $this->mClasses=array('T1'=>'t1.inc.php','T2'=>'t2.inc.php'); 
  13.  } 
  14.  function &create($class
  15.  { 
  16.   if (!class_exists($class)) 
  17.   { 
  18.    require_once($this->mClasses[$class]); 
  19.   } 
  20.   return new $class
  21.  } 
  22. ?> 
  23. //t1.inc.php 
  24. global $config; 
  25. $config='surfchen'
  26. class T1 
  27.  var $mName='name::T1'
  28.  function getName() 
  29.  { 
  30.   return $this->mName; 
  31.  } 
  32. ?> 
  33. //t2.inc.php 
  34. class T2 
  35.  function T2() 
  36.  { 
  37.   echo 't2 is ok'
  38.  } 
  39. ?> 

在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()这个方法去执行数据库的相应操作即可,这样就屏蔽了差异,使类更加健壮!代码如下:

  1. class Mysql{ 
  2.     public static $conn
  3.     public static function getInstance(){ 
  4.         if (!self::$conn){ 
  5.             new self(); 
  6.             return self::$conn
  7.         }else { 
  8.             return self::$conn
  9.         } 
  10.          
  11.     } 
  12.     private  function __construct(){     
  13.         self::$conn=  "mysql_connect:";//    mysql_connect('','','')     
  14.     } 
  15.      
  16.     public function __clone() 
  17.     { 
  18.         trigger_error("Only one connection"); 
  19.     } 
  20. echo Mysql::getInstance(); 
  21. echo Mysql::getInstance(); 

实际中用作数据库连接类和工厂模式一起使用,根据参数调用单例模式,可以提高资源使用效率.

分享到:
php HTTP_X_FORWARDED_FOR,HTTP_VIA,REMO...
php HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR区别总结 一、没有使用代理服务器的情况: REMOTE_ADDR = 您的 IP HTTP_VIA = 没数值或不显示 HTTP_X_FORWARDED_FOR = 没数值或不显示 二、使用透明代理服务器的情况:Transparent Proxies REMOTE_ADDR = 最后一个代理服务器 IP HTTP_VIA...
php禁止页面缓存的代码介绍 - php高级应...
php禁止页面缓存的代码介绍 在php中禁止页面缓存的代码相当简单,只要利用 php header()浏览器发送一个Cache-Control: no-cache或设置页面缓存过期时间为你今天之前就可以了。 有朋友说给出下面这句最简单的禁止页面缓存的方法,代码如下: header("Cache-Control: no-cache, must-revalidate...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……