单例模式的实现:
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