工厂模式
设计模式的含义:
所谓设计模式,就是针对某些常见的典型设计需求(目的),前人总结的实现该需求(目的)的一套典型代码模式——就是套路,是前人经验的总结。
当然,不同的需求(目的),有不同的代码模式,也就形成了不同的设计模式。
工厂模式的含义:
就是要设计这样一个类,它专门用于“生产其他某些类的对象”——这个类,被称为工厂类。
跟现实中的工厂类似:
汽车工厂:专门生产各种型号的汽车;
空调工厂:专门生产各种类型的空调;
工厂类:专门生产各种类的对象;
工厂模式的实现:
classFacatory{staticfunction GetObject($className){return new $className();//可变类(名)
}
}classA{}classB{}
$obj1= Facatory::GetObject(‘A‘);
$obj2= Facatory::GetObject(‘B‘);//上述是工厂模式的最简代码模式(示意性代码)//我们来做一个稍微实用的工厂类:
classImageFactory
{//Instance,就是“实例”,也就是对象
staticfunction 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个具体的图片处理类的定义:
classpngImage{}classgifImage{}classjpgImage{}
$file= ‘123.456.gif‘;//代表用户上传的一个图片文件!
$imgObj1 = ImageFactory::GetInstance($file);//得到gifImage的对象
$imgObj2 = ImageFactory::GetInstance(‘最完美的电脑.jpg‘)//得到jpgImage的对象
单例模式
单例模式的含义:
就是要设计这样一个类,这个类具有这样的特性:它“无论如何”只能实例化出一个对象。
单例模式的实现:
//要设计这样一个类,这个类具有这样的特性:
//它“无论如何”只能实例化出一个对象。
classSingleton{private function__construct(){}private function__clone(){}static public functiongetSingle(){static $obj = null;//意图让外加通过调用本方法去获得"唯一对象"
//if( !isset($obj) )//如果还没有本类的对象
if( $obj instanceof self == false){$obj = newself();
}return $obj; //返回该对象
}
}//$s1 = new Singleton();
//$s2 = new Singleton();
$s1 = Singleton::getSingle();$s2 = Singleton::getSingle();$s3 = clone $s2;//报错!
var_dump($s1,$s2, $s3);另一种方式实现单例类:实现方式:三私一公
classSingleton2{private static $obj = null;private function__construct(){}private function__clone(){}static public functiongetSingle(){//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;
classdb{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 "
" ; var_dump($result);$sql = "select * from tab1 where id = 1";$result = $db1->getOneRow($sql);//用于测试getOneRow方法
echo "
";print_r($result);
原文:https://www.cnblogs.com/qiguaideta/p/11541603.html