加入收藏 | 设为首页 | 会员中心 | 我要投稿 南平站长网 (https://www.0599zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-01-19 15:09:19 所属栏目:PHP教程 来源:互联网
导读:1.工厂模式 工厂模式是一种类,它具有为您创建对象的某些方法,您可以使用工厂类创建对象,而不直接使用 new,这样,如果您想要更改所创建的对象类型,只需更改该工厂即可,使用该工厂的所有代码会自动更改。 主要作用是降低耦合度,代码如下: abstract class Oper
  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中设计模式工厂模式和单例模式实例

(编辑:南平站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读