PHP 工厂模式使用方法 |
本文标签:PHP,工厂模式 基本的工厂类 复制代码 代码如下: class MyObject{ //对象将从工厂返回 } class MyFactory{ public static function factory(){ return new MyObject(): } } $instance=MyFactory::factory(); 使用工厂类解析图像文件 复制代码 代码如下: <?php interface IImage{ function getHeight(); function getWidth(); function getData(); } class Image_PNG implements IImage{ private $_width,$_height,$_data; public function __construct($file){ $this->_file=$file; $this->_parse(); } private function _parse(){ //完成PNG格式的解析工作 //并填充$_width,$_height,$_data; } public function getWidth(){ return $this->_width; } public function getHeight(){ return $this->_height; } public function getData(){ return $this->_data; } } class Image_JPEG implements IImage{ private $_width,$_height,$_data; public function __construct($file){ $this->_file=$file; $this->_parse(); } private function _parse(){ //完成JPEG格式的解析工作 //并填充$_width,$_height,$_data; } public function getWidth(){ return $this->_width; } public function getHeight(){ return $this->_height; } public function getData(){ return $this->_data; } } class ImageFactory{ public static function factory($file){ $pathParts=pathinfo($file); switch (strtolower($pathParts[extension])) { case jpg: $ret=new Image_JPEG($file); break; case png: $ret=new Image_PNG($file); break; default: //有问题 } if($ret instanceof IImage){ return $ret; }else { //有问题 } } } //当使用图像文件名调用 工厂方法时,根据传入的文件类型不同,取得不同对象 。 //调用ImageFactoyr $image=ImageFactory::factory(/path/to/my.jpg); //$image是Image_JPEG类的一个实例 echo $image->getWidth(); 使用工厂类解决数据库可移值性问题 在数据库应用程序中,工厂模式可以在以下两个方面起作用 。 .使软件更容易支持各种不同的数据库平台,用于扩展用户群 .如果软件是内部使用,需要修改数据库时,可以容易将应用程序移值到别一个平台 在代码中,创建了一个名为User的数据库表来测试它,这个表定义一个名为email的varchar类型字段 复制代码 代码如下: <?php interface IDatabaseBindings{ public function userExists($email); } class PGSQL implements IDatabaseBindings{ protected $_connection; public function __construct(){ $this->_connection=pg_connect(dbname=example_db); } public function userExists($email){ $emailEscaped=pg_escape_string($email); $query="select 1 from users where email=".$emailEscaped.""; if($result=pg_query($query,$this->_connection)){ return (pg_num_rows($result)>0)?true:false; }else{ return false; } } } class MYSQL implements IDatabaseBindings{ protected $_connection; public function __construct(){ $this->_connection=mysql_connect(localhost); mysql_select_db(example_db,$this->_connection); } public function userExists($email){ $emailEscaped=mysql_real_escape_string($email); $query="select 1 from users where email=".$emailEscaped.""; if($result=mysql_query($query,$this->_connection)){ return (mysql_num_rows($result)>0)?true:false; }else{ return false; } } } class DatabaseFactory{ public static function factory(){ $type=loadtypefromconfigfile(); switch ($type){ case PGSQL: return new PGSQL(); break; case MYSQL: return new MYSQL(); break; } } } 应用程序不必知道它与何种类型的数据库连接,只会基于IDatabaseBindings接口定义的规则直接与工厂返回的实例打交道 。 复制代码 代码如下: //调用DatabaseFactoy $db=DatabaseFactory::factory(); $db->userExists(person@example.com); |