php单利模式和工厂模式,PHP常用设计模式(工厂模式&单例模式)

工厂模式

设计模式的含义:

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

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

工厂模式的含义:

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

跟现实中的工厂类似:

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

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

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

工厂模式的实现:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值