GRASP Creator действительно отделяет?

Я изучаю паттерн GRASP в школе, и у меня есть вопрос о паттерне Creator.

Допустим, у вас есть три класса, компьютер, UserRespository и пользователь.

Одно из правил шаблона GRASP Creator говорит вам назначить ответственность за создание объекта на класс, содержащий эти объекты. Следуя этому руководству, UserRepository должен быть создателем пользователя.

Поэтому, если Компьютер хочет создать пользователя, он спросит UserRespository.

//in Computer's code
repo.createUser("John");


//in UserRepository
public void createUser(String name)
{
    users.add(new User(name));
}

Это эффективно отделить компьютер от пользователя. В самом деле?

Очевидно, что Компьютер не имеет никакого отношения к Пользователю, но я думаю, что Компьютер по-прежнему тесно связан с созданием Пользователя. Зачем? Метод createUser плохо скрывает создание. Если пользователь изменит свой конструктор, вам придется изменить метод createUser, чтобы отразить эти изменения, а также каждый клиент, использующий метод.

Каковы преимущества использования этого шаблона тогда?

2 ответа

Решение

Я узнал, что развязка действительно спрашивает: "Можете ли вы извлечь этот класс из системы?". Таким образом, скрывая создание объекта за методом, учитывая, что этот объект не используется нигде, кроме как в создателе, он эффективно отсоединяет объект от системы.

Разделение возникает из-за того, что объект хранилища может быть произвольным; то есть вы можете выбрать, какой объект репозитория передать в объект компьютера. Хотя метод CreateUser все еще существует, источник данных пользователя определяется тем, какой объект репозитория используется.

В вашем примере объект хранилища чаще называют объектом UserRepository.

Другие вопросы по тегам