关于设计模式
先说说什么是设计模式吧。很多人都觉得“设计模式”这东西很玄乎,把Gof四人帮的《Design Patterns》奉为编程圣经,而我却觉得大可不必。设计模式说白了,就是在特定环境下解决某类常见问题的一种套路,按着这种套路去做就会很得心应手。但是,这并不代表这些设计模式是放之四海皆准,更不是说套着设计模式做的东西就一定是最好维护、性能最佳、至高无上的了。就算你不知道什么设计模式,只要思路正确,也能写出设计模式来。
有大师说,设计模式其实是对语言缺陷的一种弥补。这里有两层意思,一是说设计模式是基于语言的,因为语言存在缺陷,能力有所不足,所以需要设计模式去提供一种通用的解决方式去弥补这些不足;二是说,如果脱离具体语言及具体环境,生搬硬套设计模式甚至会是一种束缚,设计模式并非绝对正确。
了解了上面的观点之后,下面就通过js的单例模式来看看,JavaScript的设计模式是怎么回事。
单例模式(Singleton)
传统的单例模式大概是这么回事(Java版):
public class Singleton{
private static Singleton instance;
private int property;//某些属性
private Singleton(){
//通过私有的构造函数来保证只有一个实例
}
public static synchronized Singleton getInstance(){
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public void method(){//某些方法}
} 传统单例模式的特点就是利用私有构造函数来保证只有一个实例,使不同地方调用的都是同一个实例对象。然而这一点对于js来说就有点弱爆了,因为js是允许全局变量的,解决单例的办法很简单,定义一个全局对象就完事了(是不是觉得很原始,完全没什么模式可言):
var jsSingleton = {
property:"something",
method:function(){
console.log('hello world');
}
} 调用也很简单,无需顾及什么类名,任何地方访问jsSingleton都是同一个对象,完全不用担心。如果你气急败坏的跟我说,你这只是饿汉式的,懒汉式单例呢?如果真的创建对象时很耗费资源,或者是你对性能洁癖到一定程度,那也只能让js东施效颦的学一下传统的方式了:
var jsLazySingleton =(function(){
var instance;
//利用闭包来解决私有构造函数的问题(后面有解释)
function init (){
return {
property: 'some thing',
method: function(){}
}
}
return {
getInstance :function(){
//如果instance存在则返回,不存在则调用init()