单例模式是php提供的一种模式,它指的是在设计一个类时,需要保证整个程序运行期间针对该类只存在一个实例对象,就像世界只有一个太阳,假如现在要设计一个类表示太阳,该类只能有一个实例对象,否则就违背了客观事实。
所谓单例模式,即在应用程序中最多只有该类的一个实例存在,一旦创建,就会一直存在于内存中
应用场景:单例设计模式常应用于数据库类设计,采用单例模式,只连接一次数据库,防止打开多个数据库连接
一个单例类应具备以下特点:
案例
<?php
class Database{
private static $instance=null;//定义一个私有的静态属性$instance
//声明一个构造方法
private function __construct(){
$this->conn=mysql_connect("localhost","root","123456");
echo "得到一个conn<br>";
}
//只能通过这个方法才能返回本类的对象,该方法是静态方法
public static function getInstance(){
//如果本类中的$instance 为空,说明它还没被实例化过
if(self::$instance==null){
self::$instance=new self(); //实例化本类对象
}
return self::$instance; //返回本类对象
}
//阻止用户复制对象
private function __clone(){
}
}
$db1=Database::getInstance();
$db2=Database::getInstance();
if($db1===$db2){
echo "db1和db2是同一个对象";
}else{
echo "db1和db2不是是同一个对象";
}
?>
共产模式的作用是就是“生产”对象工厂的方法参数是要生产的对象名。
工厂设计模式常用于根据输入参数的不同或者应用程序配置的不同来创建一种专门用来实例化并返回其对应的类的实例
使用场景:使用方法 new实例化类,每次实例化只需调用工厂类中的方法实例化即可
优点:由于一个类可能会在很多地方被实例化。当类名或参数发生变化时,工厂模式可简单快捷的在工厂类下的方法中 一次性修改,避免了一个个的去修改实例化的对象
案例:使用工厂模式获取两个驱动对象
在根目录创建mysql.php文件
<?php
class mysql{
//操作mysql驱动类
}
?>
再次创建sqllite.php文件
<?php
class sqllite{
//操作sqlite的驱动类
}
?>
最后定一个工厂方法获取驱动对象
<?php
header('content-type:text/html;charset=utf-8');
class db{
//工厂方法
public static function factory($type){
if(include_once $type . '.php') {
$classname=$type;
return new $classname();
}else{
echo "出错了";
}
}
}
//获取mysql驱动对象
$mysql=db::factory("mysql");
//获取sqllite驱动对象
$sqllite=db::factory("sqllite");
var_dump($mysql);
echo"<br>";
var_dump($sqllite);
?>
描述当一个对象状态发生变化时,依赖它的对象全部收到通知,并自动更新
场景一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在时间得代码之后直接加入处理的逻辑,当更新的逻辑增多之后,代码会变的难以维护,这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码,观察者模式实现了低耦合,非侵入式的通知和更新机制
<?php
/**
* @desc 观察者
* Class Observer
*/
interface Observer
{
function update();
}
class Event
{
private $observers = [];
public function addObserver(Observer $observer)
{
$this->observers[] = $observer;
}
public function notify()
{
foreach ($this->observers as $observer) {
$observer->update();
}
}
public function trigger()
{
echo "Event trigger!!!\r\n";
}
}
class Observer1 implements Observer
{
public function update()
{
echo "observer1 update\r\n";
}
}
class Observer2 implements Observer
{
public function update()
{
echo "observer2 update\r\n";
}
}
$event = new Event();
$event->addObserver(new Observer1());
$event->addObserver(new Observer2());
$event->trigger();
$event->notify();
注册模式,解决全局共享和交换对象,已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可,将对象注册到全局的数组上,任何地方可以直接去访问
<?php
/**
* Class Register
*/
class Register
{
/**
* @var 全局数组
*/
protected static $arr;
/**
* @desc 设定对象
* @param $key
* @param $obj
*/
public static function set($key, $obj)
{
self::$arr[$key] = $obj;
}
/**
* @desc 获取对象
* @param $key
* @return mixed
*/
public static function get($key)
{
return self::$arr[$key];
}
/**
* @desc 删除对象
* @param $key
*/
public static function remove($key)
{
unset(self::$arr[$key]);
}
}
描述:将各种不同的函数接口封装成统一的API
场景:PHP的数据库连接方式有多种MySQL、MySQLI、PDO,可以用适配器统一,适用不同的数据库操作,封装成一个统一的API,类似场景还有cache适配器,可以将memache、redis、file、apc等不同的缓存,统一成一致的
实现方式:首先定义一个接口,然后有几种不同的情况,就写几个类实现接口
<?php
interface Db
{
function connect();
function query();
}
class Adapter implements Db
{
private $adapter;
public function __construct($obj)
{
$this->adapter = $obj;
}
public function connect()
{
$this->adapter->connect();
}
public function query()
{
$this->adapter->query();
}
}
class MySQL_mysql implements Db
{
protected $conn;
public function connect()
{
echo "I'm MySQL connect!!!\r\n";
}
public function query()
{
echo "I'm MySQL query!!!\r\n";
}
}
class MySQL_mysqli implements Db
{
protected $conn;
public function connect()
{
echo "I'm MySQLi connect!!!\r\n";
}
public function query()
{
echo "I'm MySQLi query!!!\r\n";
}
}
class MySQL_pdo implements Db
{
protected $conn;
public function connect()
{
echo "I'm MySQL_PDO connect!!!\r\n";
}
public function query()
{
echo "I'm MySQL_PDO query!!!\r\n";
}
}
$a = new MySQL_mysql();
$b = new MySQL_mysqli();
$c = new MySQL_pdo();
$adapter = new Adapter($a);
$adapter->connect();
$adapter->query();
$adapter = new Adapter($b);
$adapter->connect();
$adapter->query();
$adapter = new Adapter($c);
$adapter->connect();
$adapter->query();
*声明:内容来源于网络收集和整理,版权归原著所有,如来源信息有误或侵犯权益,请联系站长作修改和删除处理。