“在没有全局变量的语言中怎样提供全局变量呢?不要使用全局变量。多考虑考虑你的设计思路吧,这样对编程是有好处的。”
——Kent Beck 《测试驱动开发》
上面这句是Beck在《测试驱动开发》一书中对单件模式(singleton)的唯一阐释。
可以理解为他对单件模式是持否定态度的。
然而单件模式真像他说的那样一无是处吗?
如果真是那样,它就不会有出现在那么多的大师众多的经典著作中了。
“你需要只拥有一个对象,但不用全局对象来控制对象的实例化。” ——《设计模式精解》对单件模式意图的描述。
“强制对象单一性的机制似乎有些多余。……完全可以只创建每个对象的一个实例,然后使用该实例。事实上,这通常也是最好的方法。在没有急迫并且有意义的需要时(笔者注:这样的时候并不多),应该避免使用这些机制。不过,我们也希望代码能够传达我们的意图。如果强制对象单一的机制是轻量级的,那么传达意图带来的收益就会胜过实施这些机制的代价。” ——《敏捷软件开发-原则、模式与实践》中对单件模式应用的描述。
综合上面的思想,如果我们拿单件模式作为在程序的不同位置可以得到同一个对象实例的解决方案,我们就真的要重新考虑我们的设计了。
但是我们只是用单件模式来确保我们只会得到对象的一个实例,在程序中其实多数是通过参数传递来使用这个实例,我们才是正确的使用了这种模式,因为它真实的反应了我们的设计意图:保证了即使你因为对程序的其它部分不够了解或是一时疏忽,你也不会制造出该在程序中共用的对象的另一个实例;对此模式有认识的团队成员,也会知道我们其实是要使用对象的单一实例,这个对象是有些特殊的。
阅读(1403) | 评论(0) | 转发(0) |