工厂模式
设计模式的含义:
所谓设计模式,就是针对某些常见的典型设计需求(目的),前人总结的实现该需求(目的)的一套典型代码模式——就是套路,是前人经验的总结。
当然,不同的需求(目的),有不同的代码模式,也就形成了不同的设计模式。
工厂模式的含义:
就是要设计这样一个类,它专门用于“生产其他某些类的对象”——这个类,被称为工厂类。
跟现实中的工厂类似:
汽车工厂:专门生产各种型号的汽车;
空调工厂:专门生产各种类型的空调;
工厂类:专门生产各种类的对象;
工厂模式的实现:
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);