2020-10-29 设计模式——单例模式php

单例模式(Singleton Pattern 单件模式或单元素模式)

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式是一种常见的设计模式,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡的驱动程序常被设计成单例。

单例模式实现

单例模式是类的设计,只会最多产生一个对象的设计思想
所以我们首先是先创建一个空类,假如叫Singleton。

<?php

//单例模式
class Singleton{
}

1、因为这个类,实例化一次就产生一个新对象。所以我们需要禁止新对象的产生。即“禁止实例化”。
所谓“禁止实例化”,是禁止外部实例化。由于实例化会同时调用构造方法,所以我们进行私有化构造方法,则可以防止外部实例化。

<?php

//单例模式
class Singleton{
    //1、私有化构造方法,杜绝外部实例化
    private function  __construct(){
        echo '这是单例方法';
    }
}

2、因为外部实例化被禁止,则意味着我们根本不能产生对象。所以需要我们则需要在还没有产生对象的时候,就进入到“类内部”。这就意味着只能通过“静态方法”让类直接进入到类内部。所以我们需要在类里面定义一个静态 方法。我们取名叫做getInstance。

<?php

//单例模式
class Singleton{
    //1、私有化构造方法,杜绝外部实例化
    private function  __construct(){
        echo '这是单例方法';
    }
    //2、类入口 :允许类进入类内部。
    static public function getInstance(){
    }   
}

3、因为目的是为了得到一个对象,但此时进入类的内部依然还没有对象。所以需要在静态方法内部镜像对象实例化。并把对象返回到外部。

<?php

//单例模式
class Singleton{
    //1、私有化构造方法,杜绝外部实例化
    private function  __construct(){
        echo '这是单例方法';
    }
    //2、类入口 :允许类进入类内部。
    static public function getInstance(){
        //3、实例化产生对象
        return new self();
    }   
}

4、因为静态方法重复调用,也会产生新的对象,所以需要对实例化的产生进行控制。解决办法就是引入一个静态属性(静态方法中,不能使用$this)对对象进行存储。当我们已有对象,则直接返回对象。没有则创建。

<?php

//单例模式
class Singleton{
    //4、使用一个静态属性 ,保存实例化的对象
    static private $object = NULL ; 
    //1、私有化构造方法,杜绝外部实例化
    private function  __construct(){
        echo '这是单例方法';
    }
    //2、类入口 :允许类进入类内部。
    static public function getInstance(){
        //3、实例化产生对象
        //return new self();
        //5、判定当前保存的内容是不是当前类的对象 。判断函数 instanceof()
        if(!(self::$object instanceof self)){
            //6、当前保存的内容是不是当前类的对象, 则产生对象
            self::$object = new self();
        }
        //7、直接返回对象
        return self::$object ;  
    }   
}

5、由于克隆对象会产生新的对象,所以我们还需要禁止克隆。最直接的办法就是私有化克隆。

<?php

//单例模式
class Singleton{
    
    //4、使用一个静态属性 ,保存实例化的对象
    
    static private $object = NULL ; 
    
    //1、私有化构造方法,杜绝外部实例化
    private function  __construct(){
        echo '这是单例方法';
    }
    //8、私有化克隆
    private function __clone(){}
    
    //2、类入口 :允许类进入类内部。
    static public function getInstance(){
        //3、实例化产生对象
        //return new self();
        //5、判定当前保存的内容是不是当前类的对象 。判断函数 instanceof()
        if(!(self::$object instanceof self)){
            //6、当前保存的内容是不是当前类的对象, 则产生对象
            self::$object = new self();
        }
        //7、直接返回对象
        return self::$object ;  
    }   
}

$abc = Singleton::getInstance();
//$s2 = clone($abc);
var_dump($abc);

至此,单例模式设计完毕。

总结:

1、单例模式就是设计的类,最多只能有一个对象。

2、单例模式的设计规范是“三私一公”。

  • 私有化构造方法,禁止类在外部无限调用

  • 私有克隆方法,禁止外部无限克隆

  • 私有化静态属性,保存类内部得到的对象

  • 公有化静态方法,运行外部通过调用类内部方法

单例模式功能

1、单例模式的目的是为了保护资源的唯一性
2、单例模式还有其他功能俗气,可以在类中增加其他的类成员。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。