Сервлеты java. Выбор DAO в рантайме

142
22 ноября 2018, 02:20

Есть web приложение. При входе попадаем на страницу логина, логику самого приложения опустим.

В качестве источника данных о зарегистрированных пользователях испольуем шаблон Data Access Object, а именно интерфейс IUserDao, который имеет 2 имплементации: DatabaseUserDao и допустим MemoryUserDao.

Для получения экземпляра используем фабрику UserFactory с методом getClassFromFactory() который возвращает IUserDao.

Каким образом возможно реализовать сервлет, в частности метод init() чтобы получить возможность определить какую именно имплементацию IUserDao использовать? Идея в том, чтобы избежать в коде инициализации конкретной имплементацией:

IUserDao userDao = new DatabaseUserDao(); 

Вот так не хорошо

Спасибо!

Answer 1

Это все делается через паттерн Strategy. Вы определяете множество разных реализаций, после их всех ложите в контейнер по ключу. В нужном месте достоете нужную DAO и все.

Пример:

public interface Dao {
    void execute();
}
public class DatabaseDao implements Dao {
    @Override
    public void execute() {
        System.out.println("Database");
    }
}
public class MemoryDao implements Dao {
    @Override
    public void execute() {
        System.out.println("Memory");
    }
}
public class Container {
    private Map<String, Dao> container;
    public Container() {
        container = new HashMap<>();
        container.put("database", new DatabaseDao());
        container.put("memory", new MemoryDao());
    }
    public Dao getDao(String key) {
        return container.get(key);
    }
}
public class Application {
    public static void main(String[] args) {
        Container container = new Container();
        container.getDao("memory").execute();
        container.getDao("database").execute();
    }
}
Answer 2

Не уверен, правильно ли я понял вашу задачу, но опишу как делал я. В файле db.properties задал factory.class=model.dao.jdbc.JdbcDaoFactory В классе DaoFactory у меня есть переменная private static DaoFactory instance; и метод, который в эту переменную пишет вам экземпляр созданной фабрики. У меня это public static DaoFactory getInstance(). Он инициализирует переменную instance = (DaoFactory) Class.forName(factoryClass).newInstance(); Переменная String factoryClass = dbProps.getProperty("factory.class");. Соответственно, меняя .properties-файл, вы подставляете нужную вам фабрику.

READ ALSO
Потоки в Spring. Не могу разобраться с ThreadLocal

Потоки в Spring. Не могу разобраться с ThreadLocal

Не могу понять как это вообще работаетИспользую ThreadLocal<>

153
Random без повторений числа

Random без повторений числа

Написал класс где генерируются случайные числа (без повторения значений) и записываются в массив

201
Помогите отредактировать код JQuery

Помогите отредактировать код JQuery

В наличии есть два JS кодаПервый:

128
Изменить позицию canvas html5

Изменить позицию canvas html5

Возможно ли изменить позицию фигуры в канвасе, без того, чтоб все очищать или поверх этой фигуры налаживать новую? Позиция самой фигуры заранее...

157