Давайте рассмотрим следующую упрощенную иерархию Resource
:
public abstract class Resource {
static public boolean accepts(String resource);
}
public class AudioResource extends Resource {
static public boolean accepts(String resource) {
//Check if we can proceed this resource as audio
//Some complex logic there ...
}
}
public class VideoResource extends Resource {
static public boolean accepts(String resource) {
//Check if we can proceed this resource as video
//Another complex logic there
}
}
Resource
имеет десятки подклассов и число растет.Каждый подресурс:
- имеет некоторую логику, чтобы определить, принимает ли он ресурс или нет.Например, он может анализировать URL ресурса с помощью регулярного выражения или чего-то подобного;
- не является одноэлементным по дизайну;
Теперь мы хотим создать фабрику, которая перебирает все доступные подклассы и создает такую, котораяпринимает ресурс (проверяет его с помощью метода accepts
).
Примерно так (предположим на мгновение, что у Java есть полиморфизм статических методов):
public class ResourceFactory {
private static List<Class<Resource>> registry;
{
//Populate registry once on start
}
public static Resource createResource(String resource) {
for (Class<Resource> clazz : registry) {
if (clazz.accepts(resource))
return clazz.createInstance(resource);
}
}
}
К сожалению (или нет?), Java не поддерживает полиморфные статические методы. Учитывая это, каковы возможные способы проектирования Resource
и ResourceFactory
?