单例注册中心
信不信由你。今天早上我也在想同样的事情。
我以前使用过这种模式,但我从未找到它的参考,也不知道如何命名它。
我认为这是一种“键控”单例,其中实例存储在某处,并使用密钥获取它们。
我上次使用它是从不同来源检索数据。
我有大约 50 个数据库表(使其成为 10 个),并且我有一个前端“表”,其中要显示数据,但数据可以来自任何这些源,并且每个源都需要不同的逻辑(查询、联接、键) , ETC。 )
该前端是“可配置的”,因此我不知道要显示哪些值以及哪些值不会显示。
解决方案是将columnName(在前端)作为键,并获取正确的实例来创建正确的查询。
它一开始就安装在哈希图中,后来从数据库表中检索。
代码是这样的:
class DataFetcher {
abstract Object getData( Object id );
}
class CustomerNameDataFetcher extends DataFetcher {
Object getData( Object customerId ) {
// select name from customer where id = ?
}
}
class CompanyAdressDataFetcher extends DataFetcher {
Object getData( Object customerId ) { // don't ask why.
// select name from company , customer where customer.co = company.co and cu = ? etc.
}
}
class ProductColor extends DataFetcher {
Object getData( Object x ) {
// join from customer to color, to company to season to a bunch of table where id = ?
}
// And the list goes on.
每个子类使用不同的逻辑。
在运行时,用户配置其视图,并选择他想要查看的内容。
当用户选择要查看的列时,我使用列名称和 Id 来获取数据。
DataFetcher 全部安装在父类中(我不想为此有一个单独的类)的类方法中。
class DataFetcher {
abstract Object getData( Object id );
private static final Map fetchers = new HashMap();static {
fetchers.put("customer.name", new CustomerNameDataFetcher() );
fetchers.put("company.address", new CompanyAdressDataFetcher () );
fetchers.put("product.color", new ProductColor () );
...
}
public static DataFetcher getFetcher( String id ) {
return fetchers.get( id );
}
}
最后填充前端表我只是这样称呼它:
伪代码
for each row in table
for each column in row
column.text = DataFetcher.getFetcher( column.id ).getData( row.id )
end
end
是这样吗?或者我误读了你的描述,我的描述完全不同。
最后我认为这被称为 SingletonRegistry 或类似的东西。我(可能)喜欢你,出于需要而创造了这个。这很可能是一种常见模式。