单例模式

问题:在我们的网站中,我们原本预测能够同时在线的人数可以达到30人,但发现,实际中15个人同时在线的时候网站速度就已经变慢了。后来发现,是因为我们在网站在实际中有一个类被不断的创建,但实际上并不是创建的这么多相似的类我们都要一直用到,这占用了我们的内存,降低了我们的速度。有没有什么方法能够保证一些类只能存在一个呢?

概念:单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。

何时使用:当您想控制实例数目,节省系统资源的时候。但其缺点就是没有接口,不能继承。

简单的代码事例:

class Single{
    protected $number; 
    protected static $instance = NULL; 
  /**
      * 此时的构造函数之所以使用protect是为了防止外界进行new,当外界进行new时就会报错 
  */
  protected function __construct(){
         $this->number = mt_rand(1,33);
      }  
 /**
    * 如果对象存在,则返回这个对象。如果不存在,则new一个
 */
   public static function getInstance(){
   
     if (!self::$instance instanceof self) {      
     self::$instance = new self;      
     //instanceof 运算符: 
              //1.用来确定一个变量是否属于某个类的实例;
              //2.用来确定一个变量是否是继承自某一父类的子类的实例;
              //3.用来确定一个变量是否是实现了某个接口的对象的实例。
         } 
              return self::$instance;
     }
 }
$n1 = Single::getInstance(); 
$n2 = Single::getInstance(); 
var_dump($n1); //结果为:object(Single)#1 (1) { ["number":protected]=>int(31) }
var_dump($n2); //结果为:object(Single)#1 (1) { ["number":protected]=>int(31) }


注:由于PHP是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。所以,PHP实现的单例模式是页面级的,并不像java等编译型语言那样。比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。也就是说,在PHP中,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的(比如一个商品类的增删改查的操作方法都用数据库类一样)。

头像
QQ登录: