Я думаю, что для правильной реализации шаблона flyweight здесь ваш фабричный метод должен всегда возвращать один и тот же экземпляр конкретной стратегии (например, ConcreteStrategyEven
), а не каждый раз создавать новый экземпляр.
Если я не ошибаюсь, смысл в том, что объекты Стратегии создают хорошие весы Flyweights, заключается в том, что они часто не содержат никакого состояния (поскольку они представляют алгоритмы, а не объекты) и могут использоваться повторно.
Вот ссылка на пример фабрики Flyweight: http://www.java2s.com/Code/Java/Design-Pattern/FlyweightFactory.htm. Обратите внимание на эту часть, в частности:
public synchronized FlyweightIntr getFlyweight(String divisionName) {
if (lstFlyweight.get(divisionName) == null) {
FlyweightIntr fw = new Flyweight(divisionName);
lstFlyweight.put(divisionName, fw);
return fw;
} else {
return (FlyweightIntr) lstFlyweight.get(divisionName);
}
}
Здесь в заводском методе новый FlyweightIntr
инициализируется только в том случае, если правильный не доступен; в противном случае он извлекается из lstFlyweight
.