2013-11-19 3 views
0

Я просто хочу, чтобы расширить на этом уроке Abstract DAODAOFactory и обслуживание картины

Я хочу ввести UserService (интерфейс), JdbcUserService (класс) и аналогичные услуги и их реализации.

1) Теперь я должен разместить один экземпляр DAOFactory в месте и использовать его во всех этих сервисах, или я должен создать DAOFactory в каждой из этих служб. Как написать тесты для каждого метода.

2) Как удалить жесткое кодирование, например DAOFactory.getInstance("javabase.jdbc");, и выполнить эту настройку после приложения.

3) Кроме того, с точки зрения веб-приложения (многопоточность), каковы возможные изменения.

+0

Я немного смущен тем, почему ваши классы обслуживания имеют реализации, адаптирующиеся к стратегиям доступа к базе данных (jdbc). Являются ли ваши услуги фактически DAO?Если нет, почему бы не просто делать ваши услуги в зависимости от интерфейсов, а не от реализации? – yechabbi

+0

@yechabbi Вы правы, я должен сделать только одну реализацию Сервиса. Теперь, где нужно создать экземпляр DAOFactory, чтобы он лучше всего использовался среди служб. Пример скелета простого приложения JSP/Servlet ответит на все мои вопросы. – itsraja

+0

Я отправил вам решение, основанное на принципе проектирования инверсии управления (зависимость). – yechabbi

ответ

0

Оформление классов разрешения (внутренне, а не через конструктора или сеттер) их зависимость, как правило, тест-способность антипаттерны. В качестве примера, если у вас есть эта сложная зависимость для класса A и что вы хотите издеваться над ней в целях тестирования, так как сама зависимость разрешается классом, вы не сможете использовать макет (если вы не изменяете класс А, что само по себе является еще одной плохой практикой тестирования). Проблемы с тестируемостью, безусловно, являются одним из факторов, которые привели к широкому распространению популярности инъекций зависимостей среди разработчиков.

Если вы используете контейнер для инъекций с зависимостями (например, Spring или jboss-weld ...), ваш завод будет компонентом, управляемым вашим контейнером. Вы можете определить его область действия как Singleton, которая соответствует вашей потребности в совместном использовании одного и того же экземпляра в классах уровня обслуживания.

При тестировании вы можете легко настроить свой контейнер зависимостей, чтобы предоставить вам макетный экземпляр, чтобы облегчить ваше тестирование.

+0

На самом деле я хотел сделать это с помощью простого веб-приложения. Я видел этот проект с Spring и пытаюсь тиражировать простым языком без DI. – itsraja

+0

Я принимаю это как правильно. Спасибо за помощь. Тем не менее, я хотел бы иметь наилучший дизайн с простым приложением сервлета/jsp. – itsraja

0
  1. Возможно, вы используете общую фабрику для создания всех классов доступа к БД, поскольку они будут «семейством» связанных классов. Создайте интерфейс для фабрики, а затем реализацию, которая использует DAO для реализации классов. Таким образом, вы можете изменить систему, чтобы использовать другой способ хранения данных, или высмеивать ее для тестов.
  2. Используйте фабричный класс, чтобы скрыть эту деталь реализации. Кроме того, вы не должны открывать необработанные объекты DAO, если это вообще возможно. Лучше сделать ограниченный интерфейс для таких вещей, как «человек» и «функция работы», который предоставляет только методы, которые вам нужны, возможно даже на более высоком уровне, чем методы DAO. Опять же, это позволяет скрыть детали и изменить реализацию хранилища позже (или для тестирования/издевательства).
  3. Добавьте синхронизацию к классам, которые генерирует ваш завод. Вам нужно будет выбрать amodel, но самый простой из них - начать с синхронизации всех методов, а затем позже расслабить блокировки, если вам нужно больше производительности.

Также: Возможно, вы захотите использовать шаблон «Singleton», чтобы убедиться, что вы создаете только один экземпляр класса DAOFactory.

Так что-то вроде этого ..

Обратите внимание, что моими «Singleton» ничего не делает для обеспечения соблюдения одноплодного принципа. Он просто предназначен для использования в качестве общего способа получить на фабрике, которая используется в настоящий момент.

interface Person { 
    String getName(); 
    void setName(); 
} 

interface PersonStorage { 
    Collection<Person> getPersonsByName(final String name); 
} 

class DAOPerson implements Person { 

    public synchronized String getName() { 
    // Implementation here 
    } 

    public synchronized void setName() { 
    // Implementation here 
    } 

} 

interface Factory { 
    PersonFactory getPersonFactory(); 
} 

class DAOPersonFactory implements PersonFactory { 
    // Implementation 
} 

class DAOFactory implements Factory { 

    PersonFactory getPersonFactory() { 
    DAOPersonFactory res = new DAOPersonFactory(); 
    // Set up the instance, probably connect it to the underlying DAO 
    return res; 
    } 
} 

class FactorySingleton { 
    private Factory fac; 

    FactorySingleton(final Factory implementation) { 
    this.fac = implementation; 
    } 

    Factory getFactory() { 
    return fac; 
    }  

} 
Смежные вопросы