您的位置 首页 php

php设计模式1——单例模式

单例模式是什么?

一个类每new一次就会创建一个新的实例,而单例模式则是每次获取的都是同一个实例,在整个项目生命周期中通过单例创建的同一个类的实例都有且只有一个。

为什么要使用单例模式?

一些特殊的场景中我们需要每次都使用同一个实例,创建多个实例会造成额外的开支,浪费性能。比如:mysql连接,redis连接等。

单例模式的使用方法:

结构:

4私一公

  1. 私有化构造方法: 防止使用 new 创建多个实例;
  2. 私有化克隆方法: 防止 clone 多个实例;
  3. 私有化重建方法: 防止反序列化
  4. 私有化静态属性: 防止直接访问存储实例的属性
  5. 公有化静态创建实例方法:唯一获取实例的方法

示例:

没有使用单例的class

 <?php
class General{
    public static $instance = null;
    public static function getInstance(){
        if(null === static::$instance){
            static::$instance = new static();
        }
        return static::$instance;
    }

    public function __construct(){}
    public function __clone(){}
    public function __wakeup(){}
}
$general1 = new General();
$general2 = clone $general1;
$general3 = General::getInstance();
$general4 = unserialize(serialize($general3));
$general5 = $general3::$instance;
var_dump($general1);
echo PHP_EOL;
var_dump($general2);
echo PHP_EOL;
var_dump($general3);
echo PHP_EOL;
var_dump($general4);
echo PHP_EOL;
var_dump($general5);
echo PHP_EOL;
//打印结果:
object(General)#1 (0) {
}

object(General)#2 (0) {
}

object(General)#3 (0) {
}

object(General)#4 (0) {
}

object(General)#3 (0) {
}
  

使用了单例的class

 <?php
//4私一公

//4私
//1. 私有化构造方法: 防止使用 new 创建多个实例;
//2. 私有化克隆方法: 防止 clone 多个实例;
//3. 私有化重建方法: 防止反序列化
//4. 私有化静态属性: 防止直接访问存储实例的属性

//1公
//公有化静态获取实例方法:获取单例
class Singleton{
    private static $instance = null;
    public static function getInstance(){
        if(null === static::$instance){
            static::$instance = new static();
        }
        return static::$instance;
    }

    private function __construct(){}
    private function __clone(){}
    private function __wakeup(){}
}
//$singleton1 = new Singleton();//报错
//$singleton2 = clone $singleton1;//报错
$singleton3 = Singleton::getInstance();
$singleton6 = Singleton::getInstance();
//$singleton4 = unserialize(serialize($singleton3));//警告
//$singleton5 = $singleton3::$instance;//报错
//var_dump($singleton1);
echo PHP_EOL;
//var_dump($singleton2);
echo PHP_EOL;
var_dump($singleton3);
echo PHP_EOL;
//var_dump($singleton4);
echo PHP_EOL;
//var_dump($singleton5);
echo PHP_EOL;
var_dump($singleton6);
echo PHP_EOL;
//打印:
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}
  

可以看到,没有使用单例的class可以通过各种途径创建出新的实例,而使用了单例的class都会报错或警告,只有通过制定的方法获取实例,每次都是获取的同一个

文章来源:智云一二三科技

文章标题:php设计模式1——单例模式

文章地址:https://www.zhihuclub.com/77205.shtml

关于作者: 智云科技

热门文章

网站地图