SingletonRegistry
Верьте мне или нет. Я думал о том же самом сегодня утром.
Я использовал этот шаблон раньше, но я никогда не нашел ссылку на него и не знаю, как его назвать.
Я думаю, что это своего рода "ключевой" синглтон, где экземпляры хранятся где-то и получаются с помощью ключа.
В последний раз я использовал его для получения данных из разных источников.
У меня было около 50 таблиц базы данных (сделайте это 10) И у меня есть внешняя «таблица», в которой должны были отображаться данные, но данные могли поступать из любого из этих источников, и для каждой из них требовалась различная логика (запросы, соединения, ключи и т. д.)
Этот интерфейс был «настраиваемым», поэтому я не мог знать, какие значения должны отображаться, а какие нет.
Решением было взять значение 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.
Каждый подкласс использует различную логику.
Во время выполнения пользователь настраивает свой вид и выбирает то, что он хочет видеть.
Когда пользователь выбрал столбцы для просмотра, я использовал имя столбца и идентификатор для извлечения данных.
DataFetchers были все установлены в родительском классе (я не хотел иметь отдельный класс для этого) в методе класса.
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 или что-то в этом роде. Я (вероятно), как вы, создал это по необходимости. Скорее всего, это общая картина.