提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

很多人可能问我为什么要谈设计模式,我们只要把产品做出来而且能用就可以了啊,为什么要去搞那种难懂的软件工程,有这个时间还不如多学一些编程技巧呢,很长一段时间我和你们有同样的想法,但是后来随着项目越做越多我才突然发现过去一直忽略了这个重要的事情,良好的软件架构,良好的设计模式将会使你的软件的后期维护得到事半功倍的效果,我相信谁也不想总是重复的去写已经写过的代码,谁也不想把时间浪费在复制粘贴,然后就是无止境的DEBUG中,我们可以有更多的时间做更有意义的事情,难道不是吗?

最近我在研究Aaron Saray的《Professional PHP Design Patterns》(中译本:《PHP设计模式》),里面的讲解相当精彩,至少有些合理的软件构架将对我们有很大帮助,那么前面几期关于JavaScript本地存储我们已经谈了很多了,现在我要揭开为什么要定义先前那个IStorage接口,对的,那是因为设计模式,我们在这里阐述一下经典的设计模式——工厂模式。

关于使用设计模式的好处可以参考百度UFO的 《从 if else 到 switch case 再到抽象》 这篇文章。

好的,下面我们继续,我们知道所有的本地存储都是实现的IStorage接口,那么我们可以构建出一个工厂类(也叫类工厂)叫StorageFactory,类定义很简单,如下:

var StorageFactory = {
    create : function(name) {
     return eval("new " + name + "()");
    }
 }

这里的定义和先前的定义略有不同,因为我们想让这个工厂类作为一个静态(static)类存在,所以定义的方式有所区别,静态类的方便之处就是可以不用new而直接调用create方法,create方法有一个参数就是name,这里的name就是先前几章讲的各种各样的本地存储类,比如Cookie、UserData、DOMStorage或者是你自己扩展的类,这些类要使用必须要通过new关键字,工厂类的核心就是根据提供的名称create一个实例,当然我们提供的是字符串名称,不是代码,这时我们可以先拼接出“new StorageClass()”这样的字符串,然后请eval来帮忙生成对象。当然下面的事情就简单起来了,比如调用如下:

// TODO : 这里放
 //《JavaScript本地存储(1) : 使用Cookie》Cookie类
 // TODO : 这里放
 // 《JavaScript本地存储(2) : IE Only的userData》UserData类
 // TODO : 这里放
 // 《JavaScript本地存储(3) : DOM Storage》DOMStorage类
 var StorageFactory = {
    create : function(name) {
     return eval("new " + name + "()");
    }
 }
 var storage;
 // 创建Cookie实例
 storage = StorageFactory.create("Cookie");
 // 创建UserData实例
 storage = StorageFactory.create("UserData");
 // 创建DOMStorage实例
 storage = StorageFactory.create("DOMStorage");

由于采用了一致的IStorage接口,那么上面var storage的storage对象将具有一致的setItem、getItem、remove等方法,这样我们可以放心的调用这些方法而不需要考虑方法是否存在以及函数签名等问题。

很多朋友可能会有疑问,我们直接new不是更直接么,现在可能大家感觉设计模式比较多此一举,但是随着项目代码量的增加,设计模式在后期的维护、代码复用、功能扩展上的优势就能体现出来了,下一节我将用一个简单的例子来说明这个问题。