• 技术文章 >后端开发 >php教程

    PHP 工厂模式使用方法_php技巧

    2016-05-17 09:25:10原创403
    基本的工厂类
    复制代码 代码如下:

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

    使用工厂类解析图像文件
    复制代码 代码如下:

    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类型字段
    复制代码 代码如下:

    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');
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:PHP 工厂模式
    上一篇:PHP为表单获取的URL 地址预设 http 字符串函数代码_php技巧 下一篇:PHP 创建标签云函数代码_php技巧
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• PHP实现的拖拽图形验证,简单易用!• 一文聊聊php5.4的特性【总结】• PHP常量两种定义方法:define和const有什么区别• PHP实现LRU算法的示例代码• 分享一个neo4j(图形数据库)的PHP库!
    1/1

    PHP中文网