我正在阅读Martin Fowlers的书,即企业应用程序模式:ftp://ftp.heanet.ie/mirrors/sourceforge/w/we/webtune/Patterns%20of%20Enterprise%20Application%20Architecture.pdf。我来到了Row Data Gateway模式,特别是Registry模式。以下是本书第149页的代码段:
public static Person find(Long id) {
Person result = (Person) Registry.getPerson(id);
if (result != null)
return result;
PreparedStatement findStatement = null;
ResultSet rs = null;
try {
findStatement = DB.prepare(findStatementString);
findStatement.setLong(1, id.longValue());
rs = findStatement.executeQuery();
rs.next();
result = load(rs);
return result;
} catch (SQLException e) {
throw new ApplicationException(e);
} finally {
DB.cleanUp(findStatement, rs);
}
}
上面的代码调用了注册表类,但我不确定Registry类的好处是什么。我已阅读有关注册表类的章节,我仍然不清楚。我知道它们是静态方法。
答案 0 :(得分:1)
在这种情况下,注册表的作用类似于缓存(或者您很快就会看到的IdentityMap
),如果您的应用程序已经引用了Person
对象,它不会从数据库中获取它。
从书中
如果要查找对象,通常从另一个对象开始 与它有关联,并使用该关联导航到 它。因此,如果您想查找客户的所有订单,请启动 使用客户对象并使用方法获取订单。 但是,在某些情况下,您将无法启动适当的对象 用。
Registry
模式基本上是对象引用的持有者,因此您不必遍历复杂的对象依赖项来获取链中的最后一个对象。示例(您将永远不会在实践中看到):
class Book {
public Author author;
}
class Author {
public City city;
}
class City {
public String name;
}
您不希望通过Book -> Author
获取City
对象。
您通常使用Registry
来保留对全局对象的引用,这就是Fowler建议使用static
方法的原因,但正如您可以在page 409
上阅读的那样,您应该很少使用此模式"as a last resort"
。
设计糟糕的注册表示例
class CityRegistry {
private static Map<String, City> references = new HashMap<>();
public static void registerCity(String id, City reference) {
references.put(id, reference);
}
public static City getCity(String id) {
return references.get(id);
}
}
每当你创建一个类的实例时,你都会在Registry
中注册它,以便整个应用程序可以访问它(这可能会导致比它解决的更多问题)。