php-单列模式

原创 maolego 2022年04月14日 150 0

单例模式 也叫 单子模式,是一种常用的软件设计模式。 在应用这个模式时,可以确保一个类只能创建一个对象,这么做可以极大节省内存空间,有利于我们协调系统的整体行为。

使用单例模式创建的类(“单例类”)不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

单例模式一个主要应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄连接数据库的行为,使用单例模式可以避免大量的 new 操作,因为每一次 new 操作都会消耗系统和内存的资源。

实现单例模式的思路(三私一公)

  • 私有的静态的对象实例;
  • 私有的构造方法,在类外不能使用 new 创建对象;
  • 私有的克隆方法,在类外不能使用 clone 克隆对象;
  • 公共的静态的创建对象实例的方法。

代码:

<?php

// 使用单例模式创建一个数据库连接类
class Mysql{
    //该属性用来保存实例
    private static $conn;
    //私有的构造函数,防止在类外创建对象
    private function __construct(){
        self::$conn = mysqli_connect('localhost','root','123456');
    }
    //公共的创建对象的方法,如果不存在一个这个类的实例属性,就创建一个,否则就取这个实例属性。
   public static function getInstance(){
        if(!(self::$conn instanceof self)){
            self::$conn=new self();
        }
        return self::$conn;
    }
//私有的克隆方法,防止在类外clone对象
    public function __clone(){ }
        //防止反序列化后创建对象
        private function __wakeup(){
        trigger_error('Unserialized is not allowed !');
    }
}
    //只能这样取得实例,不能new和clone
    $obj1 = Mysql::getInstance();
    $obj2 = Mysql::getInstance();
    $obj3 = Mysql::getInstance();

    var_dump($obj1, $obj2, $obj3);

 

运行结果:

object(Mysql)#1 (0) {
}
object(Mysql)#1 (0) {
}
object(Mysql)#1 (0) {
}

通过运行结果可以看出,我们多次调用 getInstance() 方法并没有创建多个对象,所以说使用单例模式可以保证一个类只能创建一个对象,不能创建第二个对象。

本文地址: https://maolego.com/380.html
温馨提示: 本站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议
相关文章 关键词:

发表回复

*