php教程:php设计模式介绍之注册模式(7)

http://www.itjxue.com  2015-07-17 08:20  来源:未知  点击次数: 

结论

虽然注册模式简化了对大量对象的访问,但是仍然有许多问题——与全局变量联合。你需要确定要求的属性Key在访问之已经被初始化了,而且设置属性的方法可以全局访问,你的对象仍然可能在你的代码的其他部分出乎意料的被替换掉。显然,全局数据非常有好处,方便,但是你需要时刻记住任何全局数据都是有一些不安全的。

内嵌的Registry模式

除了单独使用注册模式——如本章所示,Registry模式与其他对象结合时功能也是非常强大。例如:当对象的创建代价非常昂贵(例如需要查询大量数据库来初始化对象)时,而且对象在这个应用中被使用一次或多次,如果这样,你能创建一个结合了工作模式  (见第三章) 和注册模式 的“Finder”类以获得已经创建的对象的缓存而不用再次创建他们?

以下是一个Contact类,AddressBook类是工厂类。

代码:

class  AddressBook  {
function  &findById($id)  {
return  new  Contact($id);
}
}
class  Contact  {
function  Contact($id)  {
//  expensive  queries  to  create  object  using  $id
}
//  ...  other  methods
}

你可以在AddressBook类中插入Registry模式来提供缓存。代码可以如下所示:

class  AddressBook  {
var  $registry;
function  AddressBook()  {
$this->registry  =&  Registry::getInstance();
}
function  &findById($id)  {
if  (!$this->registry->isValid($id))  {
$this->registry->set($id,  new  Contact($id));
}
return  $this->registry->get($id);
}
}

AddressBook类的构造函数将registry绑定到一个实例变量。当创建了一个特定的ID并被findById()方法调用时,Registry被检查以确定对象是否已经被缓存。如果没有,将创建一个新的对象并存储在Registry中。被调用的对象将通过函数从Registry中取出并被返回。

(责任编辑:IT教学网)

更多