面向对象中最常用,也是最简单的一种模式,单例就是单个实例单个对象的意思,就是说我们去实例化一个类的时候,不管调用多少次,都永远有一个实例,不会有多个,节省了内存分配开支<br />new实例化类是在堆上分配空间,单例会在栈上分配空间,具体咱也不懂<br />使用了静态方法返回实例,第一次实例后会常驻内存,以后不会每次都执行一次,new一次,分配资源<br />为什么不直接访问那个静态的实例化对象,而是使用方法返回,为了安全,因为静态变量可以修改,方法返回,保证变量不会被修改<br />原理是:<br />将构造函数__construct 设置为私有的private,不能再类的外边通过new关键字来实例化对象,<br />内部唯一一个实例化对象,封装为 private static 类型<br />对外提供一个静态方法返回唯一的对象
//final 无法继承重写
final class DanLi
{
//存放实例化后的对象
private static $_insert = null;
//一个静态属性
public static $id = null;
//私有化构造方法
private function __construct()
{
// echo '单例模式啊';
}
//静态方法返回实例
public static function fun()
{
self::$_insert = new DanLi();
return self::$_insert;
}
//公共方法
public function set()
{
return self::$id;
}
//公共方法
public function get($id)
{
self::$id = $id;
return self::$id;
}
}
var_dump(DanLi::$id);
$new= DanLi::fun();
var_dump($new->get(22));
var_dump($new->set());
实现方法好几种,饿汉模式,懒汉模式,线程安全的懒汉模式,DCL双检查锁机制
饿汉模式就是直接在静态变量上面直接new 实例化对象,不管此类用不用
懒汉模式就是不在静态变量上new 在静态方法上new对象,访问静态方法才会实例化对象
线程安全模式的懒汉模式就是,在多线程中,可能会new多个对象,用synchronized关键字,多线程资源同步性,保证被他修饰的方法或代码,在任意时刻只有一个线程执行
DCL双检查锁机制,就是先判断是否已经实例化,在进去用关键字synchronized 判断一下是否已经实例化,在进行操作,双检查,
有的是直接在加载类的时候就执行static静态变量,实例化类,存入内存,有的是访问才会new,就会有多线程的同步问题,衍生出后几种模式
php语言不是这样的,脚本语言,解析完后,释放所有资源,不会跟java一样,存在于整个生命周期中,变量是跨页面级的,可以做到只有一个实例化,php所有的都是页面级别,被执行,创建新的,执行完毕,都释放调,