前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php常用的三种设计模式【php】

php常用的三种设计模式【php】

作者头像
sinnoo
发布2020-11-13 11:04:05
4130
发布2020-11-13 11:04:05
举报
文章被收录于专栏:技术人生

一、单例模式

1,含义

某个类只有一个实例,自动实例化并向整个系统提供这个类的实例。

即:应用程序只会有这个类的一个实例存在。

多用在数据库操作,线程池,缓存,打印机中。

2,特点

只有一个实例,必须有构造函数,标记为private

向其他成员提供访问这个实例的静态方法

必须自行创建这个实例,拥有一个保存类的实例的静态成员变量

3,代码

代码语言:javascript
复制
class SingleCase {

    private static $_instance;

    private function __construct() {
       echo 'i has been'; 
    }
    
    public static function getInstance() {
       if(!isset(self::$_instance)) {
           self::$_instance = new self();
       }
       return self::$_instance;
    }
    
    private function __clone() {
    }
}

备注:存在难以调试,隐藏着依赖关系

二、工厂模式

1,含义

工厂模式是一个类,而这个类包含一些方法,这些方法的作用或者功能就是实例化对象

工厂模式通常用来返回符合类似接口的不同的类

2,特点

工厂模式一般有一个命名为Factory的静态方法

这个静态方法接收一个参数

这个静态方法根据参数,返回不同的对象实例

3,代码

代码语言:javascript
复制
class Factory {
    static public function getUser($type) {
        if ($type == 1) {
            return new A();
        }
        return new B();
    }
}

interface FetchName {
    public function getName()
}

class A implements FetchName {
    public function getName()
}

class B implements FetchName {
    public function getName()
}

//使用

$user = Factory::getUser(1);
$user->getName();

备注:有啥用?

如果一个系统,很多地方用 new User() 这种方式。有一天 new User('A');增加个参数,所有地方都需要变更;

如果一个系统,使用工厂模式User::getObj('1'); 假如参数1返回new User()这个对象实例; 有一天new User() 增加个参数,我只需要改工厂中的类实例。

三、观察者模式

1,含义

观察者模式为您提供了避免组件之间紧密耦合的另一种方法

分为主题和观察者,都需要实现接口和方法

主题里面进行观察者注册,并设置一个方法,这个方法的作用是调用观察者的方法进行通知观察者

2,特点

针对接口编程,不针对实现编程

观察者模式定义对象的一对多依赖

当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新

3,代码

代码语言:javascript
复制
class Paper {
    private $myObj = [];
    public function register($sub) {
        $this->myObj[] = $sub;
    }
    public function setMessage(){
      if ($this->myObj) {
          foreach ($this->myObj as $obj) {
              $obj->update();
          }
      }
    }
}

interface Observerable{
    public function update();
}

class Subscriber implements Observerable{
    public function update(){
        echo "Callback\n";
    }
}

备注:

代码语言:javascript
复制
$paper = new Paper();
代码语言:javascript
复制
$paper->register(new Subscriber());
代码语言:javascript
复制
//$paper->register(new Subscriber1());
代码语言:javascript
复制
$paper->setMessage();

只要任何类注册,调用setMessage()方法。其他注册过的类都会收到update()方法的通知。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、单例模式
  • 二、工厂模式
  • 三、观察者模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档