您的位置:首页 > 编程语言 > PHP开发

php中的工厂模式、单例模式、注册模式

2017-01-12 13:53 141 查看
工厂模式:

<?php

class Example

 { 

    public static function factory($type) { 

    //这里,表达了对象创建时的一个细节 ,需要载入相应的类文件, 现在这个细节,封装在静态工厂中,外部就不需要再写了 

        if (include_once 'Drivers/' . $type . '.php') {

             $classname = 'Driver_' . $type; 

             return new $classname; 

         } else {

          //PHP的异常处理类 : throw new Exception 

             throw new Exception ('Driver not found');

         }

     }

 }

?>

单例模式:

<?php

    class DB {

        private static $obj = null;            //声明一个私有的,静态的成员属性$obj

        private function __construct() {  //私有构造方法,只能在类的内部实例化对象 
echo "连接数据库成功<br>";

        }   

        public static function getInstance() {// 通过此静态方法才能获取本类的对象

            if(is_null(self::$obj)){

            //如果本类中的$obj为空,说明还没有被实例化过

                self::$obj = new self();

            }

                //实例化本类对象  

            return self::$obj;

            //返回本类的对象

        }

        public function query($sql) {      //执行SQL语句完成对数据库的操作

            echo $sql;

        }

    }

    $db = DB::getInstance();                  //只能使用静态方法getInstance()去获取DB类的对象

    $db -> query("select * from user");   //访问对象中的成员

注册模式:

<?php

/**

单例模式保证了一个类中只有一个实例被全局访问,当你有一组全局对象被全局访问时可能就需要用到注册者模式 (registry),它提供了在程序中有条理的存放并管理对象 (object),一种解决方案。一个“注册模式”应该提供get() 和 set()方法来存储和取得对象(用一些属性key)而且也应该提供一个isValid()方法来确定一个给定的属 性是否已经设置。 

注册模式通过单一的全局的对象来获取对其它对象的引用 实例:PHP设计模式之注册模式实例

 */

class  Registry  {

    

  protected  static  $store  =  array();   

  private static $obj;

  

  public static function instance() {

      if(!isset(self::$obj)) {

          self::$obj = new self();

      }

      return self::$obj;

  }

  

  public function  isValid($key)  {

    return  array_key_exists($key,  Registry::$store);

  }

 

  public function  get($key)  {

    if  (array_key_exists($key,  Registry::$store))

    return  Registry::$store[$key];

  }

 

  public  function  set($key,  $obj)  {

    Registry::$store[$key]  =  $obj;

  }

}

 

 

class ConnectDB {

    

    private $host;

    private $username;

    private $password;

    private $conn;

 

    public function __construct($host, $username, $password){

        $this->host = $host;

        $this->username = $username;

        $this->password = $password;

    }

 

    public function getConnect() {

        return mysql_connect($this->host,$this->username,$this->password);

    }

    

}

 

//使用测试

$reg = Registry::instance();

$reg->set('db1', new ConnectDB('localhost', 'root', '123456'));

$reg->set('db2', new ConnectDB('192.168.1.198', 'test', '123456'));

print_r($reg->get('db1'));

print_r($reg->get('db2'));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: