PHP常用的5大设计模式

Wesley13
• 阅读 754

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

1.单例模式

单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

<?php//单例模式class Singleton {    private $runtime;    private static $instance;    private function __construct() {        $this->runtime = time();    }    public static function getInstance() {        if(!(self::$instance instanceof self)) {            self::$instance = new self();        }        return self::$instance;    }    public function run() {        echo $this->runtime,PHP_EOL;    }    private function __clone() {    }    public function __destruct() {    }}$a = Singleton::getInstance();$a->run();$b = Singleton::getInstance();$b->run();$c = Singleton::getInstance();$c->run();

2.工厂模式

工厂模式(Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

<?php//工厂模式abstract class Operation {    abstract public function getValue($num1, $num2);}class OperationAdd extends Operation {    public function getValue($num1, $num2) {        return $num1 + $num2;    }}class OperationSub extends Operation {    public function getValue($num1, $num2) {        return $num1 - $num2;    }}class Factory {    public static function createObj($operate) {        switch ($operate) {            case '+':                return new OperationAdd();                break;            case '-':                return new OperationSub();                break;        }    }}$test = Factory::createObj('+');echo $test->getValue(2, 3);

3.注册模式

<?php//注册模式//创建单例class Single{    public $hash;    static protected $ins=null;    final protected function __construct(){        $this->hash=rand(1,9999);    }    static public function getInstance(){        if (self::$ins instanceof self) {            return self::$ins;        }        self::$ins=new self();        return self::$ins;    } }//工厂模式class RandFactory{    public static function factory(){        return Single::getInstance();    }}//注册树class Register{    protected static $objects;    public static function set($alias,$object){        self::$objects[$alias]=$object;    }    public static function get($alias){        return self::$objects[$alias];    }    public static function _unset($alias){        unset(self::$objects[$alias]);    }}Register::set('rand',RandFactory::factory());$object=Register::get('rand');print_r($object);

4.适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

<?php//适配器模式//目标角色  interface Target {      public function simpleMethod1();    public function simpleMethod2();}//源角色class Adaptee {    public function simpleMethod1(){        echo 'Adapter simpleMethod1'."<br>";    }}//类适配器角色class Adapter implements Target {    private $adaptee;    function __construct(Adaptee $adaptee) {        $this->adaptee = $adaptee;    }    //委派调用Adaptee的sampleMethod1方法    public function simpleMethod1(){        echo $this->adaptee->simpleMethod1();    }    public function simpleMethod2(){        echo 'Adapter simpleMethod2'."<br>";    }   }//客户端class Client {    public static function main() {        $adaptee = new Adaptee();        $adapter = new Adapter($adaptee);        $adapter->simpleMethod1();        $adapter->simpleMethod2();    }}Client::main();

5.观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

<?php//观察者模式// 主题接口interface Subject{    public function register(Observer $observer);    public function notify();}// 观察者接口interface Observer{    public function watch();}// 主题class Action implements Subject{    public $_observers=array();    public function register(Observer $observer){        $this->_observers[]=$observer;    }    public function notify(){        foreach ($this->_observers as $observer) {            $observer->watch();        }    } }// 观察者class Cat implements Observer{    public function watch(){        echo "Cat watches TV<hr/>";    }}class Dog implements Observer{    public function watch(){        echo "Dog watches TV<hr/>";    }}class People implements Observer{    public function watch(){        echo "People watches TV<hr/>";    }}// 应用实例$action=new Action();$action->register(new Cat());$action->register(new People());$action->register(new Dog());$action->notify();





  
         
         
         
   
          
          
                
             
             
             
       
              
              
              看完本文有收获?点赞、分享是最大的支持!
      
             
             
             
  
         
         
         

PHP常用的5大设计模式

本文分享自微信公众号 - Laravel技术社区(Laravel360)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java设计模式1
1:单例模式简介  单例模式是一种常用的软件设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供唯一的实例。总而言之就是在系统中只会存在一个对象,其中的数据是共享的  特点:    单例类只能有一个实例,所以一般会用static进行修释。    单例类必须自己创建自己的唯一实例。也就是在类中要new一个自己。    单例类必
Wesley13 Wesley13
3年前
java中饿汉与懒汉的故事(单例设计模式)
java中的单例设计模式关于设计模式,这其实是单独存在的东西,它不属于java,但是在java中使用较多,所以今天我就给大家介绍下单例设计模式中的饿汉和懒汉这俩朴素的打工人。首先我先说明下单例设计模式是啥(如果不想了解,可以直接划下去看饿汉和懒汉):类的单例设计模式就是采用一定的方法保证在整个软件系统中,对某个类只能存在一
亚瑟 亚瑟
3年前
说说设计模式
设计模式设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总
Wesley13 Wesley13
3年前
JAVA设计模式之单例设计模式
    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。  在JAVA中实现单例,必须了解JAVA内存机制,JAVA中实例对象存在于堆内存中,若要实现单例,必须满足两个条件:  1.限制类实例化对象。即只能产生一个对象。
Wesley13 Wesley13
3年前
(面试常问)4种单例设计模式的总结(内含代码以及分析)
单例设计模式:  单例模式,是一种常见的软件设计模式.在它的核心结构中只包含了一个被称为单例的特殊类.通过单例模式可以保证系统中只有该类的一个实例对象.优点:  实例控制:单例模式会阻止其它对象实例化其自己的单例对象的副本,从而确保所有对象都访问的是唯一的实例   灵活性:因为类控制了实例化过程,所以类可以很灵活的更改实
Stella981 Stella981
3年前
Python设计模式
对于很多开发人员来说,单例模式算是比较简单常用、也是最早接触的设计模式了,仔细研究起来单例模式似乎又不像看起来那么简单。我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便了项目开发,但是单例模式本身也有一定的局限性,如果滥用则会给后续软件框架的扩展和维护带来隐患。单例模式的实现有很多种,应用场合也各有不同,但必须保证实例唯一
Wesley13 Wesley13
3年前
Java开发中的23种设计模式详解(转)
设计模式(DesignPatterns)                                 ——可复用面向对象软件的基础设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他
Wesley13 Wesley13
3年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的
Wesley13 Wesley13
3年前
JavaWeb之动态代理解决request请求编码问题
动态代理解决编码问题1.设计模式出现原因:软件开发过程中,遇到相似问题,将问题的解决方法抽取模型(套路)常见设计模式:单例,工厂,适配器,装饰者,动态代理。2.装饰者模式简单介绍谷歌汽车开发场景1.Java定义了汽车开发约定interfaceICar{s