延迟加载
一个不包含所有所需数据的对象,但知道如何获取它。
有关完整描述,请参见 EAA 模式 第 200 页
对于将数据库中的数据加载到内存中,设计时可以方便地将相关对象与感兴趣的对象一起加载。这使得使用该对象的开发人员更容易加载,否则他们必须显式加载所有需要的对象。
但是,如果你将这种方法推向逻辑结论,你就会发现加载一个对象可能会导致加载大量相关对象,这在实际上只需要几个对象时会影响性能。
延迟加载会中断这个加载过程,在对象结构中留下一个标记,以便在需要数据时,只有在使用时才会加载数据。正如许多人所知,如果你在做事时很懒,当你发现根本不需要做这些事时,你就会赢。
延迟加载主要有四种类型。延迟初始化使用一个特殊的标记值(通常为 null)来指示一个字段未加载。每次访问该字段时,都会检查该字段是否存在标记值,如果未加载,则加载它。虚拟代理是一个与真实对象具有相同接口的对象。第一次调用其方法时,它会加载真实对象,然后进行委托。值持有者是一个具有 getValue 方法的对象。客户端调用 getValue 获取真实对象,第一次调用会触发加载。幽灵是没有任何数据的真实对象。第一次调用方法时,幽灵会将完整数据加载到其字段中。
这些方法在细节上略有不同,并且有各种权衡。你也可以使用组合方法。本书包含完整的讨论和示例。