带有行数据网关的注册表模式

时间:2013-04-17 18:42:45

标签: java design-patterns

我正在阅读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类的好处是什么。我已阅读有关注册表类的章节,我仍然不清楚。我知道它们是静态方法。

1 个答案:

答案 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中注册它,以便整个应用程序可以访问它(这可能会导致比它解决的更多问题)。