У меня есть несколько классов, которые работают как обертки над некоторыми тяжелыми библиотеками, такими как парсеры, тэггеры и другие ресурсы. У всех этих библиотек есть одна общая черта: у них есть метод load / init, который принимает в качестве входных данных сериализованную модель (большой файл) и возвращает класс, который можно использовать для выполнения конкретных задач, таких как синтаксический анализ текста.
Чтобы проиллюстрировать эту ситуацию, скажем, у меня есть библиотека ConcreteParser для анализа, для которой я создал следующий класс:
public class ParserWrapper {
private static final ConcreteParser parser = null;
private static void init(String modelFileName) {
if (parser == null)
parser = ConcreteParser.load(modelFileName);
}
public static Result parse(input) {
if (parser == null) throw new RuntimeException(...);
return parser.parse(input);
}
}
Как видите, для этого требуется, чтобы клиент сначала вызвал init перед анализом, что, безусловно, является нет-нет. Я также попробовал решение, основанное на шаблоне Singleton, но я все еще думаю, что есть лучший способ сделать то, что я хочу.
ConcreteParser является статическим, поскольку каждая модель загружается относительно долго и потребляет много памяти. Поэтому мне нужно, чтобы они были доступны всем классам, которые его используют.
Итак, мой вопрос: есть ли другой (более элегантный) способ сделать то, что я хочу? Как я могу улучшить этот код? Я думал о создании класса ResourceManager, который имел несколько методов, таких как «createParser» и «createTagger», чтобы иметь единую точку для загрузки ресурсов. Этот класс также проверяет, был ли создан каждый ресурс, и так далее. Есть мысли по этому поводу?
Привет.