• PHP常用设计模式(工厂模式&单例模式)


    工厂模式

    设计模式的含义:

    所谓设计模式,就是针对某些常见的典型设计需求(目的),前人总结的实现该需求(目的)的一套典型代码模式——就是套路,是前人经验的总结。

    当然,不同的需求(目的),有不同的代码模式,也就形成了不同的设计模式。

    工厂模式的含义:

    就是要设计这样一个类,它专门用于“生产其他某些类的对象”——这个类,被称为工厂类。

    跟现实中的工厂类似:

    汽车工厂:专门生产各种型号的汽车;

    空调工厂:专门生产各种类型的空调;

    工厂类:专门生产各种类的对象;

    工厂模式的实现:

    class Facatory{
        static function GetObject($className){
            return new $className();//可变类(名)
        }
    }
    class A{}
    class B{}
    $obj1 = Facatory::GetObject('A');
    $obj2 = Facatory::GetObject('B');
    //上述是工厂模式的最简代码模式(示意性代码)
    
    //我们来做一个稍微实用的工厂类:
    class ImageFactory
    {
        //Instance,就是“实例”,也就是对象
        static function GetInstance($fileName)
        {
            //$fileName是一个图片文件名,可能是jpg
            //gif,png 3种之一,比如:1.jpg, abc.png
            //我们每种图片都需要一个对应的类来处理
            $houzhui = strrchr($fileName, '.');//取得后缀(含.),比如:'.jpg'
            $houzhui2 = substr($houzhui,1);//取得后缀(不含.),比如:'jpg'
            $houzhui3 = strtolower($houzhui2);
            $className = $houzhui3 . "Image";//得到类似这样的“类名”:jpgImage或 pngImage,gifImage
            return new $className();
        }
    }
    //下面是3个具体的图片处理类的定义:
    class pngImage{}
    class gifImage{}
    class jpgImage{}
    $file = '123.456.gif';//代表用户上传的一个图片文件!
    $imgObj1 = ImageFactory::GetInstance($file);//得到gifImage的对象
    $imgObj2 = ImageFactory::GetInstance('最完美的电脑.jpg')//得到jpgImage的对象

    单例模式

    单例模式的含义:

    就是要设计这样一个类,这个类具有这样的特性:它“无论如何”只能实例化出一个对象。

    单例模式的实现:

    //要设计这样一个类,这个类具有这样的特性:
    //它“无论如何”只能实例化出一个对象。
    class Singleton{
        private function __construct(){}
        private function __clone(){}
        static public function getSingle(){
            static $obj = null;
            //意图让外加通过调用本方法去获得"唯一对象"
            //if( !isset($obj) )//如果还没有本类的对象
            if( $obj instanceof self == false){
                $obj = new self();
            }
            return $obj;    //返回该对象
        }
    }
    //$s1 = new Singleton();
    //$s2 = new Singleton();
    $s1 = Singleton::getSingle();
    $s2 = Singleton::getSingle();
    $s3 = clone $s2;//报错!
    var_dump($s1,$s2, $s3);
    ///////////////////////////////////////////////////////////
    /////另一种方式实现单例类://///////////////
    ///////////////////////////////////////////////////////////
    ////实现方式:三私一公
    class Singleton2{
        private static $obj = null;
        private function __construct(){}
        private function __clone(){}
        static public function getSingle(){
            //static $obj = null;
            //意图让外加通过调用本方法去获得"唯一对象"
            //判断static::$obj是否是自身(static)这个类的对象
            if( static::$obj instanceof static == false){
                static::$obj = new static();
            }
            return static::$obj;    //返回该对象
        }
    }

    应用案例:MySQL工具类

    定义一个类,要求实现如下功能:

    1,一实例化,就连接上了mysql数据库;

    2,有一个方法,可以执行“增删改”操作,并返回成功与否的结果;

    3,有一个方法,可以执行一条查询语句以获取一行数据,并返回一个一维数组;

    查询语句类似这种:select * from  XXX表  where  id = 8;

    4,有一个方法,可以执行一条查询语句以获取多行数据,并返回一个二维数组;

    查询语句类似这种:select * from  XXX表  where  id = >8 and id < 18;

    5,有一个方法,可以执行一条查询语句以获取单个数据,并返回该数据;

    查询语句类似这种:select age from  XXX表  where  id = 8;

    class db{
        private $link = null;
        function __construct($conf){
            //原始语法:mysql_connect('服务器名:端口号',用户名,密码)
            $this->link = mysql_connect("{$conf['host']}:{$conf['port']}",$conf['user'],$conf['pass']);
            mysql_query("set names {$conf['charset']}");
            mysql_query("use {$conf['dbname']}");
        }
        //此方法可以执行“增删改”操作,并返回成功与否的结果;
        //此语句类似这样:insert into .....或 delete from ...或update...
        function exec($sql){
            $result = mysql_query($sql, $this->link);
            return $result;
        }
        //此方法可以执行一条查询语句以获取一行数据,并返回一个一维数组
        //此语句类似这种:select * from  XXX表  where  id = 8;
        function getOneRow($sql){
            $result = mysql_query($sql);//这是一个结果集
            $arr = mysql_fetch_assoc($result, $this->link);//这才是一个数组
            return $arr;
        }
    }
    db-test.php文件:
    
    include './db.class.php';
    $conf = array(
        'host'=>'localhost',
        'port'=>'3306',
        'user'=>'root',
        'pass'=>'123',
        'charset'=>'utf8',
        'dbname'=>'php64',
        );
    $db1 = new db($conf);
    //下面是测试语句
    $sql = "show tables";
    $result = mysql_query($sql);//用于测试是否连接成功!
    $sql = "insert into tab1(id,name)values(1,'张三');";
    $result = $db1->exec($sql);//用于测试是否能够执行exec方法
    echo "<br />" ; var_dump($result);
    $sql = "select * from tab1 where id = 1";
    $result = $db1->getOneRow($sql);//用于测试getOneRow方法
    echo "<pre>";print_r($result);
  • 相关阅读:
    MARKDOWN测试文章
    忘记网站登录密码实现快速查看
    IDEA debug下取消后续操作
    GitHub上传文件
    注解学习
    异常
    快捷键
    Android反编译三件套 apktool 、dex2jar、jd-gui
    ILSpy反编译工具之C#反汇编
    MAVEN配置及Spring Tool Suite的Maven配置
  • 原文地址:https://www.cnblogs.com/qiguaideta/p/11541603.html
Copyright © 2020-2023  润新知