Неправильное использование шаблона Builder? - PullRequest
2 голосов
/ 21 сентября 2010

Для класса шаблонов проектирования преподаватель попросил мою команду разработать приложение, поддерживающее рисование и сохраняющиеся глифы, очень похожее на редактор WYSIWYG от GoF.

Моя команда решила использовать многоуровневую архитектуру с нисходящими слоями: презентация, контроллер, логика, постоянство.

Логика поддерживает коллекцию представлений глифов, их соответствующих позиций и некоторых уникальных по форме свойств. Инструктор предложил использовать шаблон Builder для создания единого механизма постоянства, поскольку для CSV и XML требуются форматы постоянства.

Проблема возникает, когда мы пытаемся спроектировать Builder в слое Persistence. Поскольку мы используем слои, слою постоянства запрещено явно знать о типах глифов, не говоря уже о приведении их из абстрактной формы к индивидуальным формам. Это заставляет меня чесать голову о том, что даже передавать каждому Строителю в качестве своего конструктора.

Следующая проблема заключается в том, что сложно обобщить типы, которые использует Builder. Прямоугольники имеют свойства, которых нет у линий.

У меня много проблем с пониманием, как это сделать. Я понимаю шаблон Builder, но что-то просто не щелкает. Я неправильно использую шаблон или неправильно подгоняю его к проблеме?

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

1 Ответ

2 голосов
/ 22 сентября 2010

Не уверен, что вам нужен строитель для этого. Фабрики / Реестры и сериализуемость , вероятно, более важны.

То, как вы делаете слой постоянства неосведомленным о явных типах глифов, в то же время предоставляя ему возможность сохранять и загружать определенные экземпляры глифов, через какой-то механизм отражение .Либо что-то встроенное в язык (например, Reflection в .Net или RTTI в Delphi / C ++ Builder), либо что-то, что вы создаете сами.

Чтобы создать решение самостоятельно, вам нужно, чтобы все типы глифов происходили отобщий «сериализуемый» базовый тип или пусть все они реализуют «сериализованный» интерфейс .Слой постоянства должен знать только об этом базовом типе или интерфейсе - в зависимости от того, что вы выберете.

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

«Сериализуемый» базовый тип или интерфейс должен обеспечивать постоянный уровень средствами для идентификации типа глифа по уникальному (строковому) идентификатору, средством для перебора свойствбыть сохраненным / загруженным;и средства для создания экземпляра глифа полиморфно (говорят виртуальные конструкторы и мета-классы в Delphi).

Для сохранения экземпляров должно быть достаточно получения идентификатора типа глифа и итерации по сохраняемым свойствам.

Перебор свойств должен быть простым и понятным, но если вы хотите «проектировать шаблон», вы можете использовать Visitor .Что может сделать жизнь намного проще, когда составленные и агрегированные глифы (группировка в приложениях для рисования) попадают в картину, без каламбура :-).В связи с этим вы также можете рассмотреть шаблон Composite , хотя это может быть излишним для того, что вас просили сделать.

Чтобы загрузить глифы из постоянного хранилищавам понадобится реестр где-нибудь, где типы глифов связаны с уникальным именем (строкой), чтобы уровень персистентности мог искать тип для создания экземпляра из строки в сохраняемой информации.Каждый тип глифа должен быть зарегистрирован в реестре, чтобы его можно было найти и создать экземпляр на уровне персистентности.Посмотрите шаблон Factory Method и Abstract Factory для получения дополнительной информации об этом.

...