当前位置: 首页 > 后端技术 > PHP

PHP设计模式之一——单例模式

时间:2023-03-29 16:56:54 PHP

定义了单例模式(Singletonpattern):一个类只有一个实例,由它自己实例化,提供给整个程序使用。或者可以理解为保证整个程序运行过程中只有一个这个类的实例,并提供一个可以访问它的全局访问点。应用场景对于一个程序来说,一些特殊的类在程序运行过程中保证只被实例化一次是非常重要的。打印服务是单例模式出现率比较高的一个例子。对于打印机,一次只能打印一个文件。因此,当有两个打印服务实例时,必然有一个空闲,浪费资源。如果不空闲,那么就会出现资源争用,你不希望两个文档交替打印在一页上。当你打算实现一个框架时,如果你这样想,我得先写一个核心。其他如框架配置、控制器、视图、类库等都与这个核心有关。当请求开始运行,直到请求结束,其他所有组件都由核心实例化,核心就像树干,其他组件就像挂在树干上的树枝,那么这个核心类最好用单例模式,你这时候加载的配置,你实例化的每一个组件,在这次运行的过程中肯定是这个core实例化的(因为没有别的),那么不管你怎么玩,下面的配置信息A实例不会被B实例调用。总之,我觉得单例模式最重要的有两点,保证唯一性和节省资源。实现方法以私有方式隐藏构造方法,可以防止被其他类new。没有构造方法,所以其他类没法new出这个类,只能靠自己new自己,但是有个问题,这个时候,你不存在,怎么运行你的new方法,如果你不存在??因此,要使用静态方法,可以直接使用类调用静态方法。在静态方法中,new本身可以忽略,因为它在类中。虽然new出来了,但是如果不保存,下次需要的时候又需要new,所以不是单例,需要找个安全的地方保存,静态方法只能访问静态属性,所以将新对象放入静态属性中。classSingleton{privatestatic$_instance;//保存实例化的单例//将构造函数私有化,保证单例类不能被其他对象创建newprivatefinalfunction__construct(){}//定义private__clone()方法,其中就是要保证单例类不能被复制或克隆,否则就不是单例。privatefunction__clone(){}publicstaticfunctiongetInstance(){//检查类是否实例化,如果没有实例化,就新建一个,如果已经实例化了直接返回。如果(!(self::$_instanceinstanceofself)){self::$_instance=newtest();}返回自我::$_实例;}}//获取单例实例,多次调用同一个InstanceSingleton::getInstance();Advantage提供对唯一实例的受控访问。因为系统内存中只有一个对象,可以节省系统资源。对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能。缺点单例模式破坏了普通类模式,没有抽象层,扩展起来非常困难。单例模式会污染全局变量,以便在运行时保持唯一性并可全局访问。

猜你喜欢