单例模式概念
单例模式是指整个应用中类只有一个对象实例的设计模式。
单例模式的特点
- 一个类在整个应用中只有一个实例
- 类必须自行创建这个实例
- 必须自行向整个系统提供这个实例
单例模式的构造
一、三私一公:
①、私有静态属性,又来储存生成的唯一对象
②、私有构造函数
③、私有克隆函数,防止克隆——clone
④、公共静态方法,用来访问静态属性储存的对象,如果没有对象,则生成此单例
二、关键词instanceof
检查此变量是否为该类的对象、子类、或是实现接口。
1、一个private的__construct是必须的,单例类不能在其它类中实例化,只能被自身实例化;
2、拥有一个保存类的实例的静态成员变量;
3、一个静态的公共方法用于实例化这个类,并访问这个类的实例;
class SingleInstance{
private function _construct(){
}
private static $instance;
private function _clone(){
}
public static function getInstance(){
if(!self::$instance instanceof SingleInstance){
self::$instance=new SingleInstance();
}
return self ::$instance;
}
}
php中单例模式的应用场景
1.PHP的应用有一个大方面是针对于数据库,一个应用中会存在大量的数据库操作,在使用面向对象的方式开发时,如果使用 单例模式,就可以避免大量的new 操作消耗的资源,还可以减少数据库连接,这样就不容易出现too many connections情况。
2.如果一个系统中需要一个类来全局控制某些配置信息,那么,使用单例模式可以很方便的实现。
3.在一次页面请求中便于进行调试,因为所有代码都集中在一个类中,可以在类中设置钩子,输出日志,避免到处的var_dump(),echo。
php中单例模式的优缺点
优点:1.实现了对唯一实例访问的可控
2.对于一些需要频繁创建和销毁的对象来说可以提高系统的性能。
缺点:1. 不适用于变化频繁的对象
2.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出。
3.如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失。