思考:有一种需求,希望一个类有且只能有一个对象,这样保证对象的完整性,请问该如何实现呢?
引入:我们将这种一个类最多只能一个对象称为单例,在操作系统中这种方式需求很多,如任务管理器,而通过代码实现这中单例的设计思路我们称为单例模式
单例模式
定义:单例模式singleeton,是一种类的设计只会最多产生一个对象的设计思想
<?php
class singglelon{
//设置属性来保存对象
private static $object=null;
//构造方法系优化 不允许在外部实例化
private function __construct(){
echo __METHOD__;
}
public static function getinfo(){
// 判断对象 instanceof 是判断一个对象是否属于这个类的 或者子类
// 当前保存的object 不是singglelon对象
if(!self::$object instanceof self){
// 产生对象
self::$object=new self;
}
// 返回对象
return self::$object;
}
}
$s1=singglelon::getinfo(); //返回同一个对象
var_dump($s1);
$s2=singglelon::getinfo(); //返回的是同一个对象
var_dump($s2);
?>
以上方法可以保证无论多少次调用共有静态方法获取实例,都会只能得到一个对象,但是此时外部对象依然可以产生新的对象,因为克隆,所以还必须禁止对象的克隆
即在类内部私有化克隆方法。
private function __clone(){
}
$s3 =clone $s2; //克隆报错 var_dump($s3);
总结
1.单例模式就是设计的类最多只能得到一个对象
2.私有化构造方法,禁止在类外无限实例化对象
3.私有化克隆方法,禁止对象无线克隆对象
4.私有化静态属性,保存类内部实例化得到的对象
5.公有化静态方法,允许外部通过调用类内部方法获取对象
单例模式如果还有其他功能诉求,可以在类中增加相应的其他类成员
单例模式的目的是为了保护资源唯一性。
来源:https://www.cnblogs.com/xiaowie/p/12241049.html