好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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 类有两个创建对象的静态方法.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(); 

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

查看更多关于php中设计模式工厂模式和单例模式实例 - php高级的详细内容...

  阅读:33次