[英]Registry pattern with Row Data Gateway
我正在阅读Martin Fowlers的书,即企业应用程序模式: ftp : //ftp.heanet.ie/mirrors/sourceforge/w/we/webtune/Patterns%20of%20Enterprise%20Application%20Architecture.pdf 。 我遇到过行数据网关模式,尤其是注册表模式。 这是本书第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);
}
}
上面的代码调用了注册表类,但是我不确定注册表类的好处是什么。 我已经阅读了有关注册表类的章节,但仍不清楚。 我了解它们是静态方法。
在这种情况下,注册表的作用就像一个缓存(或者您很快就会看到或可能已经拥有的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
注册它,以便整个应用程序都可以访问它(这可能会引起更多的问题,而不是解决的问题)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.