首页 > 互联资讯 > 技术交流  > 

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

单例模式是什么?

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

为什么要使用单例模式?

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

单例模式的使用方法:

结构:

4私一公

私有化构造方法: 防止使用 new 创建多个实例;

私有化克隆方法: 防止 clone 多个实例;

私有化重建方法: 防止反序列化

私有化静态属性: 防止直接访问存储实例的属性

公有化静态创建实例方法:唯一获取实例的方法

示例:

没有使用单例的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) {
}


php设计模式1——单例模式由讯客互联技术交流栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“php设计模式1——单例模式