Некоторые сомнения по поводу того, что делает Фабрика - PullRequest
1 голос
/ 04 сентября 2010

Я не совсем уверен, что полностью понимаю фабричный шаблон.

Допустим, у меня есть класс Customer, который имеет в основном следующие методы:

  • CreateCustomer- static, создает клиента с нуля и добавляет его в базу данных,
  • LoadCustomer - static, загружает экземпляр Customer из базы данных,
  • KillCustomer - не статический, удаляет клиента из базы данных.

Если я правильно понимаю,

  1. LoadCustomer - хороший кандидат на включение взаводской класс.
  2. А как же CreateCustomer?Я полагаю, что может быть переведено в фабричный класс .Это правильно?Если нет, статический метод CreateCustomer изменит состояние базы данных, , затем вызовите CustomerFactory.LoadCustomer.ИМХО, это плохой дизайн: данному объекту не нужно ничего знать о ее собственной фабрике.
  3. KillCustomer мне кажется очень плохой кандидат для фабрики: это действует на уже созданный объект, а не на его создание.С другой стороны:
    • Если нестатический метод удаляет клиента из базы данных, объект (из которого был вызван KillCustomer) все еще существует.Это довольно странно видеть объект, совершающий самоубийство на уровне базы данных и все еще остающийся на бизнес-уровне .На этом уровне было бы разумнее звонить KillCustomer с завода.Например, если объект кэшируется в приложении, фабрика может удалить его как из базы данных, так и из кэша.
    • Помещение в разные классы метода, который создает объект, и метода, который удаляет его, также кажется странным. Почему фабрика может просто что-то построить и никогда не разрушить то, что было построено?

И последнее, но не менее важное: скажем, клиенты кэшируются в приложении. Кто отвечает за управление кешем? ИМО, фабрика должна это делать: она создает объекты, так что это хороший выбор, чтобы выбрать, должен ли быть загружен новый объект со свойствами, заполненными из базы данных, или еслиобъект уже существует в кеше.

Итак, что правильно и что не так в том, что я думаю о фабричном шаблоне?

1 Ответ

3 голосов
/ 04 сентября 2010

Фабрика не для строительства вещей. Это для создания вещей, когда вы не знаете точно, что вы собираетесь строить. На мой взгляд, все ваши методы плохие кандидаты на завод.

Теперь, если в иерархии наследования у вас была целая куча разных типов клиентов с корнем в Customer, и некоторые детали о данных, использованных для создания клиента, определяли, какой тип клиента был сделан, то CreateCustomer быть отличным кандидатом на заводской метод. То же самое и с LoadCustomer, поскольку, вероятно, вы не совсем уверены, какой именно клиент хранится в базе данных.

Но KillCustomer все еще плохой кандидат. И это потому, что это должен быть просто виртуальный метод. Затем он точно знает, к какому типу клиентов он был привлечен.

...