PHP实现单例模式和观察者模式

时间:2021-08-20 05:09:24

单例模式的实现:

PHP中单例模式常用在数据库连接部分,省掉了大量的new操作进而节省了很多资源。单例模式还可以用在全局配置类中。

单例模式,顾名思义就是说只有一个实例,这就要求防止外部随意实例化对象。

PHP中单例模式的要点:

1、构造函数必须私有,防止外部非法new操作。

2、需要有一个私有静态的存放本类实例的类成员变量。

3、clone函数需要私有化,防止外部克隆。

4、有一个获取本类实例的公共的静态的方法。

代码如下:

<?php

/**
*PHP实现单例模式
*/
class Db
{
// 保存本类对象
private static $instance;
// 测试信息
private $message;
// 私有的构造函数
private function __construct($message) {
$this->message = $message;
}
// 防止被克隆
private function __clone() {}
// 获取本类实例的方法
public static function getInstance($message) {
if (! self::$instance instanceof self) {
self::$instance = new self($message);
}
return self::$instance;
}
public function getMessage() {
echo $this->message;
}
}
$db1 = Db::getInstance("我是第一个实例!");
$db1->getMessage();
echo "<br/>";
$db2 = Db::getInstance("我是第二个实例!");
$db2->getMessage(); ?>

运行结果如下:

我是第一个实例!
我是第一个实例!

观察者模式的实现:

观察者模式中主要存在两类对象,一个是主题(或者说是被观察者)和观察者,主题提供注册观察者和通知观察者的接口。

一个简单的使用场景是订票:

当订好车票时一般会伴随很多后续操作,比如:记录日志,短信通知,送积分等等。当主题改变时,在这就是订好票了,会通知观察者们进行相应操作,就是调用观察者的方法。

代码如下:

<?php

/**
*PHP实现观察者模式
*/ /* 主题接口 */
interface Subject
{
public function register(Observer $observer);
public function notify($type);
} /* 观察者接口 */
interface Observer
{
public function watch($type);
} /* 主题实现类 */
class Order implements Subject
{
public $_observers = array();
public function register(Observer $observer) {
$this->_observers[] = $observer;
}
public function notify($type) {
foreach($this->_observers as $observer) {
$observer->watch($type);
}
}
} /* 三个观察者实现类 */ class Log implements Observer
{
public function watch($type) {
echo "日志收到通知:$type<br/>";
}
} class Message implements Observer
{
public function watch($type) {
echo "短信收到通知:$type<br/>";
}
} class Reward implements Observer
{
public function watch($type) {
echo "奖励收到通知:$type<br/>";
}
} define('EVENT_ORDER', 1);
$order = new Order();
$order->register(new Log());
$order->register(new Message());
$order->register(new Reward());
$order->notify(EVENT_ORDER); ?>

运行结果:

日志收到通知:1
短信收到通知:1
奖励收到通知:1