单例模式(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、单例模式还有其他功能俗气,可以在类中增加其他的类成员。