1 设计模式
1.1 工厂模式
public Registry getRegistry(URL url) {
. . .
// Lock the registry access process to ensure a single instance of the registry
LOCK.lock();
try {
Registry registry =REGISTRIES.get(key);
if (registry !=null) {
return registry;
}
registry = createRegistry(url);
if (registry ==null) {
throw new IllegalStateException("Can not create registry " + url);
}
REGISTRIES.put(key, registry);
return registry;
}finally {
// Release the lock
LOCK.unlock();
}
}
protected abstract Registry createRegistry(URL url);
AbstractRegistryFactory 实现了RegistryFactory接口的getRegistry(URL url) ,是一个通用实现,主要完成了加锁,以及调用抽象模版方法createRegistry(URL url)创建具体实现等操作,并缓存在内存中。抽象模版方法会由具体子类继承并实现。
1.2 模版模式
AbstractRegistry 实现了Registry接口中的注册,订阅,查询,通知等方法,还实现了磁盘文件持久化注册信息这一通用方法。但是注册,订阅,查询,通知等方法只是简单地把URL加入对应的集合,没有具体的注册或订阅逻辑。
FailbackRegistry 继承了AbstractRegistry,重写了父类的注册,订阅,查询和通知等方法,并且添加了重试机制,此外,还添加了四个未实现的抽象模版方法。
// ==== Template method ====
protected abstract void doRegister(URL url);
protected abstract void doUnregister(URL url);
protected abstract void doSubscribe(URL url, NotifyListener listener);
protected abstract void doUnsubscribe(URL url, NotifyListener listener);
具体实现由子类来实现。