单例模式
単例模式就是某个类只有一个实例,自行实例化并向整个系统提供这个实例
単例模式的实现:
1:私有化一个属性用于存放唯一的实例
2:私有化构造方法
3:私有化克隆方法,用来创建并只允许创建一个实例
4:公有化静态方法,用于向系统提供这个唯一实例
<?php
class Singleton {
//1.私有化属性存放实例
private static $_instance = null;
//2.私有化构造方法
private function __construct() {
}
//3.克隆方法私有化
private function __clone() {
// TODO: Implement __clone() method.
}
//4.公有化静态方法,用于向系统提供这个唯一实例
public function getInstance() {
//如果不是当前类的实例,那么实例化当前类创建新实例
if(!self::$_instance instanceof self){
self::$_instance = new self();
}
return self::$_instance;
}
}
$obj1 = Singleton::getInstance();
$obj2 = Singleton::getInstance();
$obj3 = Singleton::getInstance();
var_dump($obj1,$obj2,$obj3);
#输出
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}
因为静态方法可以在全局范围内被访问,当我们需要一个单例模式的对象时,只需调用getInstance方法,获取先前实例化的对象,无需重新实例化。
因为静态方法可以在全局范围内被访问,当我们需要一个单例模式的对象时,只需调用getInstance方法,获取先前实例化的对象,无需重新实例化。
优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景: 1、要求生产唯一序列号。 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
注意事项:getInstance() 方法中需要使用同步锁 synchronized 防止多线程同时进入造成 instance 被多次实例化
上一篇 php设计模式之工厂模式
下一篇 php设计模式之注册树模式