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

单例模式的实现:

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

猜你喜欢

转载自www.cnblogs.com/wp1996/p/8992656.html