Требуется решение № 2 по ряду причин. И вы не хотите, чтобы оно было статичным.
Несмотря на то, что статическая игра кажется забавной, это кошмар обслуживания, когда вы придете либо (а) к новому алгоритму с такими же требованиями, либо (б) к новым требованиям.
Первоклассный объект (без особого внутреннего состояния) позволяет вам развиваться в иерархии классов, отличающихся друг от друга - некоторые медленнее, некоторые быстрее, некоторые с большим объемом памяти, некоторые с меньшим объемом памяти, некоторые для старых требований, некоторые для новые требования.
Некоторые из ваших отличий могут привести к сложному внутреннему состоянию или памяти, либо к инкрементному разнесению, либо к различию на основе хеш-кода. Все виды возможностей могут существуют.
Многократно используемый объект позволяет вам выбрать разницу во время запуска приложения, используя файл свойств.
В долгосрочной перспективе вы хотите минимизировать количество новых операций, которые разбросаны по всему вашему приложению. Вы хотели бы, чтобы ваши новые операции были сосредоточены в местах, где вы можете их найти и контролировать. Чтобы перейти от старого алгоритма отличия к новому алгоритму отличия, вам нужно сделать следующее.
Написать новый подкласс.
Обновите файл свойств, чтобы начать использовать новый подкласс.
И будьте полностью уверены, что не было спрятанных d= new MyObjDiffer( x, y )
, о которых вы не знали.
Вы хотите использовать d= theDiffer.getResults( x, y )
везде.
Что делают библиотеки Java, так это то, что у них есть статический DifferFactory. Фактор проверяет свойства и выдает правильную разницу.
DifferFactory df= new DifferFactory();
MyObjDiffer mod= df.getDiffer();
mod.getResults( x, y );
Фабрика обычно кэширует одну копию - ей не нужно физически читать свойства каждый раз, когда вызывается getDiffer
.
Этот дизайн дает вам максимальную гибкость в будущем. На это похоже на другие части библиотек Java.