一、基础【创建型模式】
1、定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
【通俗易懂:有一个class,你无法保证别的人会在其他的控制器里new 这个类,所以要保证这个类是私有的,别人在其他的控制器是无法new这个类的】
这种模式涉及到单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
2、主要解决:一个全局使用的类频繁的创建与销毁;
3、何时使用?:当想控制实例数目,节省资源的时候;
4、特点:构造器必须是私有的,外部类无法通过调用构造器方法创建该实例;
需要提供一个公开的方法来获取这个唯一的实例;
5、优点:某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销;
new是很耗资源的操作,省去了NEW 操作符,降低了系统内存的使用频率,减轻GC(垃圾回收机制)压力;
避免了对资源的重复占用;
缺点:没有接口,不能继承;
6、分类
懒汉式:当第一次访问单例模式时才进行创建;什么时候用什么时候初始化;
饿汉式:直接在最开始的时候直接创建;不管用不用都直接创建;
相对于java的单利模式有8中写法,php的单利模式就是太简单了。可以说没有饿汉式。
还是要会手写单例模式^^^^^ 哪怕为了面试呢
<?php
class Singleton{
//私有属性,用于保存实例
private static $instance;
//构造方法私有化,防止外部创建实例
private function __construct(){}
//公有属性,用于测试
public $a;
//公有方法,用于获取实例
public static function getInstance(){
//判断实例有无创建,没有的话创建实例并返回,有的话直接返回
if(!(self::$instance instanceof self)){
self::$instance = new self();
}
return self::$instance;
}
//克隆方法私有化,防止复制实例
private function __clone(){}
}
$sing = Singleton::getInstance();
$sing->test();
懒汉式和饿汉式对比后的应用场景:
如果某个数据是经常访问的热点数据,那我们可以在系统启动的时候使用饿汉模式提前加载,这样哪怕是第一个用户调用都不会创建,而且调用频繁也不会存在内存浪费了;
如果数据一段时间内不会经常有人调用,那就用懒汉;如果你使用的是饿汉式,过了好几个月还没调用,提前加载的类在内存中是有资源浪费的;