1、单例模式
单例模式是为了实现在整个项目中只创建一个实例对象的设计模式,最常见的如数据库连接对象。
<?php
class Single{
// 用于判断是否为同一对象
public $ran;
// 用于存储已创建的对象
static protected $ins=null;
// 防止直接new 生成对象
final protected function __construct(){
$this->ran = rand(0,999);
}
// 防止克隆
protected function __clone(){}
// 创建对象唯一接口
static public function getInstance(){
if (self::$ins == null) {
self::$ins=new self();
}
return self::$ins;
}
}
$single1 = Single::getInstance();
var_dump($single1);
$single2 = Single::getInstance();
$single2->ran = 111111;
var_dump($single1);
var_dump($single2);
// $single3 = new Single();
// var_dump($single3);
// $single4 = clone $single1;
// $single4->ran = 1234;
// var_dump($single4);
// var_dump($single1);
// var_dump($single2);
// var_dump($single3);
// var_dump($single4);
?>
关键点在于私有的构造方法、克隆方法、静态属性和公有的静态方法(防止new和clone生成对象)。
代码实现:
<?php
class Single{
// 用于存储已创建的对象
static protected $ins=null;
// 防止直接new 生成对象
final protected function __construct(){}
// 防止克隆
protected function __clone(){}
// 创建对象唯一接口
static public function getInstance(){
if (self::$ins == null) {
self::$ins=new self();
}
return self::$ins;
}
}
$single1 = Single::getInstance();
?>
2、工厂模式
使用工厂方法生成对象,在类发生变化后只需要修改工厂方法就可以实现全部修改。如果是直接new生成对象,则需要对每次调用new生成方法进行修改。
代码实现:
<?php
// 需要使用工厂方法的类
class Test{
public function sayHello(){
var_dump(__FILE__);
}
}
// 工厂方法
class Factory{
static public function getTest(){
return new Test();
}
}
Factory::getTest()->sayHello();
?>
3、观察者模式
观察者模式用于:当被观察者属性变化或者执行某些操作时,观察者会收到通知并进行相应操作。
观察者模式的优点是利于构建低耦合性的架构。
主要步骤:
1、被观察对象实现注册观察者的方法;
2、被观察对象实现通知方法;
3、观察者实现响应方法;
代码实现:
<?php
// 被监视对象 人
class People{
protected $_observer = array();
public function addObserver($observer){
$this->_observer[] = $observer;
}
// 被监视的动作 主人回家
public function goHome(){
// 通知响应动作
foreach ($this->_observer as $observer) {
$observer->changeHome();
}
}
}
// 观察者 狗
class Dog {
// 监视到变化,所做的动作
public function changeHome(){
echo "变乖,出门相迎";
echo "<br>";
}
}
$people1 = new People();
$people1->addObserver(new Dog());
$people1->goHome();
?>
以上代码已经实现了最基本的观察者模式,但有的时候观察者不仅只有一个,为了便于组织代码,所以引入接口和抽象类。
代码实现:
<?php
// 观察者 接口
interface Observer{
// 观察者 响应 变化
public function respond();
}
// 被观察者 抽象类
abstract class EventGenerator{
private $_observers = array();
// 注册观察者
function addObserver(Observer $observer){
$this->_observers[]=$observer;
}
// 通知被观察者
function notify(){
foreach ($this->_observers as $observer){
$observer->respond();
}
}
}
// 被监视对象 人
class People extends EventGenerator{
// 主人回家 通知观察者
public function goHome(){
$this->notify();
}
}
// 观察者 狗
class Dog implements Observer{
// 监视到变化,所做的动作
public function respond(){
echo "变乖,出门相迎";
echo "<br>";
}
}
// 观察者 猫
class Cat implements Observer{
public function respond(){
echo "变乖,撒娇";
echo "<br>";
}
}
$people1 = new People();
$people1->addObserver(new Dog());
$people1->addObserver(new Cat());
$people1->goHome();
?>