Есть web приложение. При входе попадаем на страницу логина, логику самого приложения опустим.
В качестве источника данных о зарегистрированных пользователях испольуем шаблон Data Access Object, а именно интерфейс IUserDao, который имеет 2 имплементации: DatabaseUserDao и допустим MemoryUserDao.
Для получения экземпляра используем фабрику UserFactory с методом getClassFromFactory() который возвращает IUserDao.
Каким образом возможно реализовать сервлет, в частности метод init() чтобы получить возможность определить какую именно имплементацию IUserDao использовать? Идея в том, чтобы избежать в коде инициализации конкретной имплементацией:
IUserDao userDao = new DatabaseUserDao();
Вот так не хорошо
Спасибо!
Это все делается через паттерн 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();
}
}
Не уверен, правильно ли я понял вашу задачу, но опишу как делал я.
В файле 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
-файл, вы подставляете нужную вам фабрику.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Не могу понять как это вообще работаетИспользую ThreadLocal<>
Написал класс где генерируются случайные числа (без повторения значений) и записываются в массив
Возможно ли изменить позицию фигуры в канвасе, без того, чтоб все очищать или поверх этой фигуры налаживать новую? Позиция самой фигуры заранее...