GRASP Creator действительно отделяет? - PullRequest
2 голосов
/ 13 июня 2009

Я изучаю паттерн 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 ]

1 голос
/ 05 августа 2009

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

0 голосов
/ 13 июня 2009

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

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

...