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);

 

posted @ 2019-09-18 13:46  青椒茄子  阅读(1117)  评论(0编辑  收藏  举报
ヾ(≧O≦)〃嗷~