作者:老王
有句老话儿说:尽信书不如无书。写程序也是一样,不仅要知其然,更要知其所以然,并不是照搬几个设计模式就显得更有技术含量。今天我打算聊聊Zend Framework中Front Controller的Singleton实现,阐述一下存在的问题。
先说说什么是Singleton?
所谓Singleton是指某个类只实例化一个对象。有的时候是因为客观情况需要这样的限制,比如说Windows操作系统里只有一个回收站实例;更多的时候是因为Singleton可以避免类被频繁的实例化,从而提高效率。
下面看看Java框架里(struts,spring)的一些例子代码:
struts:
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response
) throws Exception;
spring:
public ModelAndView handleRequest(
HttpServletRequest request,
HttpServletResponse response
) throws Exception;
这些代码有一个共同的特点,就是把request,response统统作为方法参数,而不是作为对象属性。为什么要采用这样的方式呢?是因为通过剥离request,response等因素,相关对象变成为无状态对象,然后通过Singleton便可以在各个请求之间重复使用对象实例。
下面回到Zend Framework上来,从文档上,我们可以看到Zend_Controller_Front的Singleton描述:
Zend_Controller_Front also implements the Singleton pattern, meaning only a single instance of it may be available at any given time. This allows it to also act as a registry on which the other objects in the dispatch process may draw.
相关代码:
$front = Zend_Controller_Front::getInstance();
看上去很美。可惜做错了。因为我们用的是PHP,而不是Java。在Java中,一个Singleton的对象不仅可以在同一个请求中被重复使用,还可以在不同的请求中重复使用。而在PHP中,每一次请求中,运行环境都需要重新建立,所以说在PHP中,Singleton的使用范围相对而言是窄一些的,只能在同一个请求中重复使用。Zend_Controller_Front作为Zend Framework中的前端控制器,在同一个请求中本来就只需要实例化一次,所以它不存在重复使用的需求,自然就不应该使用Singleton。在这样的情况下如果还去生搬硬套,结果就好像是穿着西装去打篮球一样,虽然衣着很帅,但却不合时宜。
补充:很多网友提醒我,在ZendFramework中是存在Zend_Controller_Front的复用的,如helper, plugin等等,我不否认ZendFramework存在这样的用法,但是我认为这也是不对的,至少是不好的。与其说是复用Zend_Controller_Front,其实是为了复用Request,Response这些对象,但从道理是来说,这些对象应该多以对象属性或者方法参数的方式传递才好,生硬的在方法内部通过静态调用Singleton方法的方式去复用,不仅不优美,并且也没有机会去Mock,存在很多弊端。归根到底还是那句话,对一个PHP请求来说,是不存在前端控制器的复用的。
分享到:
相关推荐
C++完美实现Singleton模式
java singleton 不解释不解释不解释不解释
单例模式,Singleton两种代码实现。一般实现方法,泛型实现方法(推荐)
用VC实现的singleton 模式 在VS03,VC6.0下编译通过
双重检测锁(Double-Checked Locking)实现的Singleton模式在多线程应用中有相当的价值。在ACE的实现中就大量使用ACE_Singleton模板类将普通类转换成具有Singleton行为的类。这种方式很好地消除了一些重复代码臭味,...
如果某个类管理了系统中的某种资源,那么我们只能创建该类的一个实例,此时用到singleton设计模式(后面为了简化将省略“设计模式”四个字)比较合适了。然而,如果不注意实现方法,很有可能会让我们碰到一些...
实现了单例模型。 vs2015的工程
四种常见的单例: 1、没有构造函数(DEFINE_SINGLETON_DEFAULT); 2、有构造函数,构造函数没有参数(DEFINE_SINGLETON_CONSTRUCT_NO_PARAM); 3、有构造函数,构造函数有没有... 通过宏定义巧妙实现,使用也很方便!
简单的单例模式举例Singleton 分为恶汉式 懒汉式
Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,确保用户无法通过new直接实例化它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()...
本文档,是利用C++来实现设计模式中的,单例模式,里面有内容说明和相关实例代码介绍
Laravel开发-singleton-pattern 帮助程序包来实现单例类。
单例模式(Singleton)的6种实现,单例模式(Singleton)的6种实现
单例模式 Singleton 单例模式线程安全问题和拓展
Singleton pattern单例模式应用
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
singleton是最常见的设计模式,但是要设计好却是不容易,尤其是多线程的时候,需要考虑线程安全的问题.
本文实例讲述了JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能。分享给大家供大家参考,具体如下: 单例模式 单例模式的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中...