单例模式 php-PHP 设计模式(单例、工厂、注册表、策略、观察者)

单例模式

单例模式确保一个类只有一个实例,并实例化自身并将该实例提供给整个系统。

单例模式是一种常见的设计模式。 在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作和显卡驱动程序通常被设计为单例。

单例模式分为三种类型:懒人式单例、饥饿人式单例、注册式单例。

单例模式具有以下三个特点:

1. 只能有一个实例。

2. 该实例必须由您自己创建。

3. 该实例必须提供给其他对象。

class Single {
    private $name;//声明一个私有的实例变量
    private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。
    }
    static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
    static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象
        if(!self::$instance) self::$instance = new self();
        return self::$instance;
    }
    public function setname($n){ $this->name = $n; }
    public function getname(){ return $this->name; }
}
$oa = Single::getinstance();
$ob = Single::getinstance();
$oa->setname('hello world');
$ob->setname('good morning');
echo $oa->getname();//good morning
echo $ob->getname();//good morning

工厂模式

工厂模式是我们最常用的实例化对象模式,是一种用鞋工厂方法代替new操作的模式。

使用鞋工厂模式的用处在于,如果要修改实例化的类名等,只需要修改鞋工厂方法的内容即可,不需要再去查找具体实例化的地方代码一一(新增)修改。 为系统结构提供灵活的动态扩展机制,减少耦合。

<?php
header('Content-Type:text/html;charset=utf-8');
/**
 *简单工厂模式(静态工厂方法模式)
 */
/**
 * Interface people 人类
 */
interface  people
{
    public function  say();
}
/**
 * Class man 继承people的男人类
 */
class man implements people
{
    // 具体实现people的say方法
    public function say()
    {
        echo '我是男人
'; } } /** * Class women 继承people的女人类 */ class women implements people { // 具体实现people的say方法 public function say() { echo '我是女人
'; } } /** * Class SimpleFactoty 工厂类 */ class SimpleFactoty { // 简单工厂里的静态方法-用于创建男人对象 static function createMan() { return new man(); } // 简单工厂里的静态方法-用于创建女人对象 static function createWomen() { return new women(); } } /** * 具体调用 */ $man = SimpleFactoty::createMan(); $man->say(); $woman = SimpleFactoty::createWomen(); $woman->say();

注册方式

注册模式,寻址全局共享和交换对象。 创建的对象挂在一个可以全局使用的链表上。 当需要使用时,直接从链表中获取即可。 在全局树上注册该对象。 任何地方都可以直接访问。

<?php
class Register
{
    protected static  $objects;
    function set($alias,$object)//将对象注册到全局的树上
    {
        self::$objects[$alias]=$object;//将对象放到树上
    }
    static function get($name){
        return self::$objects[$name];//获取某个注册到树上的对象
    }
    function _unset($alias)
  {
        unset(self::$objects[$alias]);//移除某个注册到树上的对象。
    }
}

策略模式

策略模式是对象的行为模式单例模式 php单例模式 php,旨在封装一组算法。 动态选择所需的算法并使用它。

策略模式是指程序中涉及决策控制的模式。 策略模式非常强大,因为这种设计模式本身的核心思想就是面向对象编程的多态思想。

策略模式的三个角色:

1.抽象策略角色

2.具体战略角色

3. 环境角色(参考具体政策角色)

实施步骤:

1.定义具体角色类(定义各个实现的公共抽象方法)

2.定义具体的策略类(常见的实现方式是父类)

3.定义环境角色类(私有化并声明具体角色变量,重载构造方法,执行具体方法)

PrintPage ();
            }
        }
        $bro = new Browser ();
    echo $bro->call ( new ieAgent () );
?>

观察者模式

1:观察者模式(Observer),当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并手动更新。

2:场景:风暴发生后,需要进行一系列的更新操作。 传统的编程方法是直接在storm代码中添加处理逻辑。 当更新逻辑增多时,代码就会显得不可维护。 这种方法具有耦合性和侵入性,添加新的逻辑需要更改storm的主要代码。

3:观察者模式实现低耦合、非侵入式的通知和更新机制。

abstract class EventGenerator
{
    private $ObServers = [];
    //增加观察者
    public function add(ObServer $ObServer)
    {
        $this->ObServers[] = $ObServer;
    }
    //事件通知
    public function notify()
    {
        foreach ($this->ObServers as $ObServer) {
            $ObServer->update();
        }
    }
}
/**
 * 观察者接口类
 * Interface ObServer
 */
interface ObServer
{
    public function update($event_info = null);
}
/**
 * 观察者1
 */
class ObServer1 implements ObServer
{
    public function update($event_info = null)
    {
        echo "观察者1 收到执行通知 执行完毕!n";
    }
}
/**
 * 观察者1
 */
class ObServer2 implements ObServer
{
    public function update($event_info = null)
    {
        echo "观察者2 收到执行通知 执行完毕!n";
    }
}
/**
 * 事件
 * Class Event
 */
class Event extends EventGenerator
{
    /**
     * 触发事件
     */
    public function trigger()
    {
        //通知观察者
        $this->notify();
    }
}
//创建一个事件
$event = new Event();
//为事件增加旁观者
$event->add(new ObServer1());
$event->add(new ObServer2());
//执行事件 通知旁观者
$event->trigger();