PHP 中使用工厂模式

高洛峰
发布: 2016-12-17 11:21:21
原创
1171人浏览过

工厂类是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它允许动态的替换类,修改配置,通常会使应用程序更加 灵活,熟练掌握工厂模式高级php开发人员是很重要的。 

  工厂模式通常用来返回符合类似接口的不同的类,工厂的一种常见用法就是创建多态的提供者,从而允许我们基于应用程序逻辑或者配置设置来决定应实例化哪一个 类,例如,可以使用这样的提供者来扩展一个类,而不需要重构应用程序的其他部分,从而使用新的扩展后的名称 。 

  通常,工厂模式有一个关键的构造,根据一般原则命名为Factory的静态方法,然而这只是一种原则,工厂方法可以任意命名,这个静态还可以接受任意数据 的参数,必须返回一个对象。 

基本的工厂类

class MyObject{  
  //对象将从工厂返回  
}  
  
class MyFactory{  
public static function factory(){  
return new MyObject():  
   }  
}  
  
$instance=MyFactory::factory();
登录后复制

使用工厂类解析图像文件

立即学习PHP免费学习笔记(深入)”;

Php代码 

<?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 {  
            //有问题  
        }  
    }  
}  
  
//当使用图像文件名调用 工厂方法时,根据传入的文件类型不同,取得不同对象。
登录后复制

Php代码 

//调用ImageFactoyr  
$image=ImageFactory::factory('/path/to/my.jpg');  
//$image是Image_JPEG类的一个实例  
echo $image->getWidth();
登录后复制

使用工厂类解决数据库可移值性问题,在数据库应用程序中,工厂模式可以在以下两个方面起作用。

1.使软件更容易支持各种不同的数据库平台,用于扩展用户群

2.如果软件是内部使用,需要修改数据库时,可以容易将应用程序移值到别一个平台

 

在代码中,创建了一个名为User的数据库表来测试它,这个表定义一个名为email的varchar类型字段

 

Php代码 

<?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接口定义的规则直接与工厂返回的实例打交道。

 

Php代码 

//调用DatabaseFactoy  
$db=DatabaseFactory::factory();  
$db->userExists('person@example.com');
登录后复制

更多PHP 中使用工厂模式相关文章请关注PHP中文网!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号