代码改变世界

Pro javascript design pattern 读书笔记之 A singleton with private members 之 lazy instantiantion

2008-10-27 10:48  wlstyle  阅读(294)  评论(0)    收藏  举报

Lazy instantiation

 以上所有我们讨论到的实现单一设计模式的方式有一个共同点。他们在一加载的时候就被创建了。如果改对象很消耗资源,使这个对象在需要的时候进行实例化这会更加的合理。

这被成为lazy loading。这个技术通常在需要加载很大量的数据的时候才用到。如果你使用单一设计模式作为一个命名空间。一个页面的数据包装。或者一个打包相关联的附加方法。他们需要马上实例化。

这些lazy loading不同之处在于他们通过静态方法访问。而不是这样访问Sington.methodName(),你需要这样访问这个方法。Sington.getInstance().methodName().getInstance这个方法检查是否对象已经实例化。如果他还没有实例化,他将实例化该类 然后返回该对象。如果该对象已经存在,那么他将存储一个该对象的拷贝。为了将一个对象转化为lazy loading singleon对象。首先让我们观察一下有私有成员的单一对象。

 

singleton with private member

 

到目前为止任何地方都没有被改变。要做的第一步就是将所有的代码contructor函数中。

 

the step one of lazy instantiation

 

这个方法无法在闭包外部访问。这是一件好事情。你想在当他调用的时候控制他,可以通过公有方法getInstance去实现这一点。为了使他能被公共访问。将他简单放入一个对象,并且返回该对象就可以了。

 

The stuctor of lazy instantiantion

 

 现在你就可以准备在类实例化的时候控制的代码了。他需要做两件事情,首先,他必须知到该类在之前是否已经实例化了,其次,如果已经实例化需要跟踪这个实例确保这个实例被返回。为了做这两件事情。使用一个私有的属性和一个存在的私有方法constructor:

 

lazy instantiation

       一旦单一对象转换为一个lazy loading单一对象,你必须改变调用方法的写法。在这个例子中,你必须向下面这种写法来调用方法。

GiantCorp.Singleton.publicMethod1();

在其它地方,我们将这样来调用这个方法。

GiantCorp.Singleton.getInstance().publicMethod1();

部分lazy loading单一对象的缺点是增加了复杂性。代码创建这个类型的单一对象是不是很直接同时对于理解方面也有些困难(虽然可以通过好的注释来解决这个问题)。如果你需要创建一个可以延期创建的单一对象。可以在这个地方创建一个注释以便让你明白为何这样做。这样其它的开发者库可以很快明白这是一个普通的单一对象。

为长的命名空间取一个较短的别名这样也是很有用的。一个别名就是一个变量他是对一个特别对象的引用。这这个例子中。GiantCorp.Singleton可以这样简称GCS.

Var GCS=GiantCorp.Singleton

这样就创建了一个新的全局变量,所以最好在页面封装的单一对象中定义这个变量。当单一对象在单一对象中包装的时候。由于作用域的出现,我们可以用到全称(比如GiantCorp.SingletonName)this当访问其它对象的时候。