기술나눔

디자인 패턴 빌더 패턴

2024-07-12

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

디자인 패턴 중 빌더 패턴(Builder Pattern)은 일반적으로 사용되는 객체 생성 디자인 패턴으로 복잡한 객체 구성 문제를 해결하는 데 주로 사용됩니다. 빌더 모드에 대한 자세한 소개는 다음과 같습니다.

1. 정의

빌더 패턴은 복잡한 객체의 구성과 표현을 분리하여 동일한 구성 프로세스로 다른 표현을 만들 수 있도록 합니다. 즉, 복잡한 개체의 구축 과정을 일련의 간단한 단계로 나누고 사용자가 이러한 단계의 순서와 매개 변수를 지정하여 다양한 개체를 만들 수 있도록 하는 방식으로 작동합니다.

2. 클래스 다이어그램 및 구조

클래스 다이어그램

빌더 모드에는 일반적으로 다음 역할이 포함됩니다.

  1. 제품 역할(제품): 일반적으로 여러 구성 요소를 포함하는 구성되는 복잡한 개체를 나타냅니다.
  2. 추상 작성기: 제품 객체의 다양한 구성 요소를 생성하기 위한 추상 인터페이스를 정의합니다.
  3. 콘크리트 빌더: Builder 인터페이스를 구현하고, 복잡한 제품의 각 구성 요소에 대한 구체적인 생성 방법을 완성하고, 최종 제품을 반환하는 인터페이스를 정의합니다.
  4. 감독 : 복잡한 객체 생성을 완료하기 위해 빌더 객체에서 구성 요소 구성 및 어셈블리 메서드를 호출하는 역할을 담당합니다. 특정 제품 정보는 포함되지 않으며 클라이언트와 빌더를 분리할 뿐입니다.

3. 적용 가능한 시나리오

빌더 패턴은 다음 시나리오에 적합합니다.

  1. 객체 구조가 복잡하다: 빌드해야 하는 객체의 내부 구조가 복잡하고 여러 속성과 메소드를 포함하는 경우 빌더 패턴을 사용하면 빌드 프로세스를 단순화할 수 있습니다.
  2. 빌드 프로세스가 복잡함: 객체의 구성 프로세스에 여러 단계가 포함되고 이러한 단계의 순서와 매개변수가 다를 수 있는 경우 빌더 패턴은 명확한 구성 프로세스를 제공할 수 있습니다.
  3. 분리된 생성 및 사용: 사용자가 객체의 최종 표현에만 관심을 갖고 객체 생성의 세부 사항에 신경 쓸 필요가 없도록 객체 생성 및 사용 프로세스를 분리하려는 경우 빌더 패턴이 좋은 선택입니다.

4. 장점과 단점

이점
  1. 좋은 캡슐화: 빌더 내에서 복잡한 객체의 구성 프로세스를 캡슐화합니다. 클라이언트는 구성 프로세스의 세부 사항을 알지 못한 채 구성 유형과 매개변수만 지정하면 최종 제품을 얻을 수 있습니다.
  2. 좋은 확장성: 새로운 빌드 유형을 추가하거나 빌드 프로세스를 수정해야 하는 경우 빌더 클래스만 추가하거나 수정하면 되며 이는 클라이언트 코드에 영향을 미치지 않습니다.
  3. 높은 유연성: 빌더의 빌드 순서나 매개변수를 변경하여 다양한 제품 인스턴스를 생성할 수 있는 유연성.
결점
  1. 수업 수를 늘리세요: 빌더 인터페이스, 특정 빌더 클래스, 커맨더 클래스 등 여러 클래스를 생성해야 하므로 시스템 내 클래스 수가 늘어날 수 있습니다.
  2. 내부수정의 어려움: 제품의 내부 구조가 변경되면 여러 빌더 클래스를 수정해야 하므로 시스템 유지 관리 비용이 증가할 수 있습니다.

5. 예시

다음 예에서는 빌더 패턴을 사용하여 주택 개조 시스템을 설계해 보겠습니다.우리는House 클래스는 여러 장식 구성 요소(예: 천장, 페인트, 바닥, 바닥 타일 등)를 포함하는 복잡한 개체입니다.그런 다음, 우리는HouseBuilder 이러한 구성 요소를 생성하기 위한 추상 메서드가 포함된 인터페이스입니다. 다음으로, 각각의 특정 장식 스타일(예: 럭셔리 유럽 스타일, 가벼운 럭셔리 목가적 스타일, 현대적인 미니멀리스트)에 대한 특정 빌더 클래스를 만듭니다.마지막으로, 우리는Director클래스를 사용하여 빌드 프로세스를 안내하지만 이 예제에서는 빌더 클래스에서 직접 전체 빌드 논리를 정의할 수 있으므로 필요하지 않을 수 있습니다.

그러나 지휘자 역할의 개념을 보여주기 위해 우리는Director클래스이지만 설명 목적으로만 실제로 빌드 프로세스는 빌더 클래스에서 직접 수행될 수 있습니다.

  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. 결론

위의 소개를 통해 빌더 패턴은 복잡한 객체를 구축할 때 큰 장점이 있음을 알 수 있습니다. 이는 구성 프로세스를 표현과 분리하여 코드의 캡슐화 및 확장성을 향상시키고 클라이언트와 특정 제품 사이의 시간을 단축합니다. . 사이의 결합 정도.

이 글이 공부에 도움이 되셨다면 꼭 좋아요와 수집 부탁드립니다.