Обмен технологиями

Шаблон конструктора шаблонов проектирования

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Шаблон Builder в шаблонах проектирования — это широко используемый шаблон проектирования создания объектов, который в основном используется для решения сложных задач построения объектов. Вот подробное введение в режим строителя:

1. Определение

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

2. Диаграмма классов и структура

Диаграмма классов

В режиме строителя обычно включаются следующие роли:

  1. Роль продукта (Продукт): представляет собой создаваемый сложный объект, обычно содержащий несколько компонентов.
  2. абстрактный строитель: Определите абстрактный интерфейс для создания различных компонентов объектов продукта.
  3. Бетоностроитель: реализовать интерфейс Builder, завершить конкретные методы создания каждого компонента сложного продукта и определить интерфейс, который возвращает конечный продукт.
  4. Директор : отвечает за вызов методов построения и сборки компонентов в объекте-строителе для завершения создания сложных объектов. Он не требует конкретной информации о продукте, он просто отделяет клиента от производителя.

3. Применимые сценарии

Шаблон Builder подходит для следующих сценариев:

  1. Структура объекта сложна.: Если объект, который необходимо построить, имеет сложную внутреннюю структуру и содержит несколько свойств и методов, использование шаблона построителя может упростить процесс построения.
  2. Процесс сборки сложный: Когда процесс построения объекта включает в себя несколько этапов, а порядок и параметры этих шагов могут быть разными, шаблон построителя может обеспечить четкий процесс построения.
  3. Разделение создания и использования: если вы хотите разделить процессы создания и использования объектов, чтобы пользователям нужно было заботиться только об окончательном представлении объекта и не заботиться о деталях создания объекта, шаблон построителя является хорошим выбором.

4. Преимущества и недостатки

преимущество
  1. Хорошая инкапсуляция: Инкапсулируйте процесс строительства сложных объектов в конструкторе. Клиенту достаточно указать тип и параметры конструкции, чтобы получить конечный продукт, не зная деталей строительного процесса.
  2. Хорошая масштабируемость: Если вам нужно добавить новый тип сборки или изменить процесс сборки, вам нужно только добавить или изменить класс построителя, что не повлияет на код клиента.
  3. Высокая гибкость: Гибкость создания различных экземпляров продукта путем изменения порядка сборки или параметров сборщика.
недостаток
  1. Увеличить количество занятий: Из-за необходимости создания нескольких классов, таких как интерфейсы строителей, специальные классы строителей и классы командиров, количество классов в системе может быть увеличено.
  2. Сложность внутренней модификации.: Если внутренняя структура продукта изменится, возможно, потребуется изменить несколько классов сборщиков, что приведет к увеличению затрат на обслуживание системы.

5. Пример

В следующем примере мы будем использовать шаблон строителя для разработки системы ремонта дома.Мы определимHouse Классы — это сложные объекты, которые содержат несколько компонентов декора (например, потолки, краски, полы, напольная плитка и т. д.).Затем мы определяемHouseBuilder Интерфейс, содержащий абстрактные методы для создания этих компонентов. Далее мы создаем конкретные классы строителей для каждого конкретного стиля отделки (например, роскошный европейский стиль, легкая роскошная пастораль, современный минимализм).Наконец, мы пройдемDirectorкласс для управления процессом сборки, но в данном примере это может быть необязательно, поскольку мы можем определить полную логику сборки непосредственно в классе строителя.

Однако для демонстрации концепции роли дирижера мы сохранимDirectorclass, но только для иллюстративных целей, на самом деле процесс сборки можно выполнить непосредственно в классе строителя.

  1. // 房屋类
  2. public class House {
  3. private String ceiling; // 吊顶
  4. private String paint; // 涂料
  5. private String floor; // 地板
  6. private String tiles; // 地砖
  7. // 私有构造函数
  8. private House() {}
  9. // Getter 方法
  10. public String getCeiling() {
  11. return ceiling;
  12. }
  13. public String getPaint() {
  14. return paint;
  15. }
  16. public String getFloor() {
  17. return floor;
  18. }
  19. public String getTiles() {
  20. return tiles;
  21. }
  22. // 建造者接口
  23. public interface HouseBuilder {
  24. HouseBuilder buildCeiling(String ceiling);
  25. HouseBuilder buildPaint(String paint);
  26. HouseBuilder buildFloor(String floor);
  27. HouseBuilder buildTiles(String tiles);
  28. House build();
  29. }
  30. // 豪华欧式建造者 ,注意是静态内部类
  31. public static class LuxuryEuropeanBuilder implements HouseBuilder {
  32. private House house;
  33. public LuxuryEuropeanBuilder() {
  34. this.house = new House();
  35. }
  36. @Override
  37. public HouseBuilder buildCeiling(String ceiling) {
  38. house.ceiling = "豪华欧式吊顶: " + ceiling;
  39. return this;
  40. }
  41. @Override
  42. public HouseBuilder buildPaint(String paint) {
  43. house.paint = "豪华欧式涂料: " + paint;
  44. return this;
  45. }
  46. @Override
  47. public HouseBuilder buildFloor(String floor) {
  48. house.floor = "豪华欧式地板: " + floor;
  49. return this;
  50. }
  51. @Override
  52. public HouseBuilder buildTiles(String tiles) {
  53. house.tiles = "豪华欧式地砖: " + tiles;
  54. return this;
  55. }
  56. @Override
  57. public House build() {
  58. return house;
  59. }
  60. }
  61. // ... 可以为其他风格创建类似的建造者类
  62. // 指挥者类(可选,这里主要用于展示概念)
  63. public static class Director {
  64. private HouseBuilder builder;
  65. public Director(HouseBuilder builder) {
  66. this.builder = builder;
  67. }
  68. // 这里可以添加方法来指导建造过程,但在这个例子中,我们直接在建造者中完成了所有工作
  69. public House constructHouse() {
  70. // 假设这是由指挥者指导的步骤,但在这里我们直接返回建造者的结果
  71. return builder
  72. .buildCeiling("水晶吊灯")
  73. .buildPaint("金色镶边涂料")
  74. .buildFloor("大理石地板")
  75. .buildTiles("马赛克地砖")
  76. .build();
  77. }
  78. }
  79. // 主函数,用于演示
  80. public static void main(String[] args) {
  81. HouseBuilder luxuryBuilder = new LuxuryEuropeanBuilder();
  82. // Director director = new Director(luxuryBuilder); // 如果使用指挥者
  83. House house = luxuryBuilder
  84. .buildCeiling("水晶吊灯")
  85. .buildPaint("金色镶边涂料")
  86. .buildFloor("大理石地板")
  87. .buildTiles("马赛克地砖")
  88. .build();
  89. System.out.println("Ceiling: " + house.getCeiling());
  90. System.out.println("Paint: " + house.getPaint());
  91. System.out.println("Floor: " + house.getFloor());
  92. System.out.println("Tiles: " + house.getTiles());
  93. }
  94. }

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

6. Заключение

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

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