单例模式
介绍:是最常见的模式之一,在Web应用的开发中,常常用于允许在运行时为某个特定的类创建仅有一个可访问的实例。 使用场景:比方“打印机“不管多少请求,最终只能实例化出一个“打印机“。
class Singleton{
//私有属性,用于保存实例
private static $instance;
//构造方法私有化,防止外部创建实例
private function __construct(){}
//公有属性,用于测试
public $a;
//公有方法,用于获取实例
public static function getInstance(){
//判断实例有无创建,没有的话创建实例并返回,有的话直接返回
if(!(self::$instance instanceof self)){
self::$instance = new self();
}
return self::$instance;
}
//克隆方法私有化,防止复制实例
private function __clone(){}
}
$first = Singleton::getInstance();
$second = Singleton::getInstance();
$first->a = "zs";
echo "<pre>";
print_r($first);
print_r($second);
输出
$first->a = "zs";
$second->a = "ls";
echo "<pre>";
print_r($first);
print_r($second);
工厂模式
说明:知道基类会衍生出很多子类的情况 使用场景:如,通过工厂定义缓存存取类,子类具体来定义具体的实现类型,是redis,还是文件缓存等
//产品类
<?php
/**
* 车子系列
*
*/
abstract Class BWM{
function __construct($pa) {
}
}
Class BWM320 extends BWM{
function __construct($pa) {
}
}
Class BMW523 extends BWM{
function __construc($pb){
}
}
//创建工厂类
/**
* 创建工厂的接口
*
*/
interface FactoryBMW {
function createBMW();
}
/**
*
* 创建BWM320车
*/
class FactoryBWM320 implements FactoryBMW {
function createBMW($type){
return new BWM320();
}
}
/**
*
* 创建BWM523车
*/
class FactoryBWM523 implements FactoryBMW {
function createBMW($type){
return new BMW523();
}
}
//客户类
/**
*
* 客户得到车
*/
class Customer {
private $BMW;
function getBMW($type){
switch ($type) {
case 320:
$BWM320 = new FactoryBWM320();
return $BWM320->createBMW();
case 523:
$BWM523 = new FactoryBWM523();
return $BWM320->createBMW();
//....
}
}
}
观察者模式
注册模式
说明:注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。
class Register
{
protected static $objects;
function set($alias,$object)//将对象注册到全局的树上
{
self::$objects[$alias]=$object;//将对象放到树上
}
static function get($name){
return self::$objects[$name];//获取某个注册到树上的对象
}
function _unset($alias)
{
unset(self::$objects[$alias]);//移除某个注册到树上的对象。
}
function print_r()
{
var_dump(self::$objects);//移除某个注册到树上的对象。
}
}
$obj = new Register();
$obj->set('1','a');
$obj->set('2','b');
$obj->set('3','c');
echo $obj->get('1');
echo"</br>";
echo $obj->get('2');
echo"</br>";
echo $obj->get('3');
echo"</br>";
echo $obj->get('1');//二次调用
echo"</br>";
$obj->print_r();die;
适配器模式
说明:将各种截然不同的函数接口封装成统一的API。 PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis,file,apc等不同的缓存函数,统一成一致。 首先定义一个接口(有几个方法,以及相应的参数)。然后,有几种不同的情况,就写几个类实现该接口。将完成相似功能的函数,统一成一致的方法。
//接口 IDatabase
<?php
namespace IMooc;
interface IDatabase
{
function connect($host, $user, $passwd, $dbname);
function query($sql);
function close();
}
//MySQL
<?php
namespace IMooc\Database;
use IMooc\IDatabase;
class MySQL implements IDatabase
{
protected $conn;
function connect($host, $user, $passwd, $dbname)
{
$conn = mysql_connect($host, $user, $passwd);
mysql_select_db($dbname, $conn);
$this->conn = $conn;
}
function query($sql)
{
$res = mysql_query($sql, $this->conn);
return $res;
}
function close()
{
mysql_close($this->conn);
}
}