基本的工厂类 <div class="codetitle"><a style="CURSOR: pointer" data="57108" class="copybut" id="copybut57108" onclick="doCopy('code57108')"> 代码如下:<div class="codebody" id="code57108"> class MyObject{ //对象将从工厂返回 } class MyFactory{ public static function factory(){ return new MyObject(): } } $instance=MyFactory::factory(); 使用工厂类解析图像文件 <div class="codetitle"><a style="CURSOR: pointer" data="48822" class="copybut" id="copybut48822" onclick="doCopy('code48822')"> 代码如下:<div class="codebody" id="code48822"> <?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,$_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,$_data; public function construct($file){ $this->_file=$file; $this->_parse(); } private function _parse(){ //完成JPEG格式的解析工作 //并填充$_width,$_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类型字段 <div class="codetitle"><a style="CURSOR: pointer" data="26796" class="copybut" id="copybut26796" onclick="doCopy('code26796')"> 代码如下:<div class="codebody" id="code26796"> <?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接口定义的规则直接与工厂返回的实例打交道。 <div class="codetitle"><a style="CURSOR: pointer" data="66317" class="copybut" id="copybut66317" onclick="doCopy('code66317')"> 代码如下:<div class="codebody" id="code66317"> //调用DatabaseFactoy $db=DatabaseFactory::factory(); $db->userExists('person@example.com');
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|